数组名取地址以及数组名作为sizeof操作符的操作数

数组名取地址十分好玩,在这里记录一下,如果大家有不同见解,欢迎留言探讨:

在大多数情况下,数组名都会默认转换为指向数组的第一个元素的指针。这一点相信大家都知道。比如下边的例子:

  int array[3] = {1,2,3};
  
  cout << *array << endl;
  
  cout << array[0] << endl;

上边的两个输出的值是相同的,这个时候array作为数组名默认转换为指向数组的第一个元素的指针。对数组名称进行解引用得到的是数组的第一个元素的值。因此两个输出语句的值时相同的。

当数组名作为取地址操作符的操作数的时候情况比较有意思,这个时候数组名不是默认转换为数组的第一个元素的指针。下边来用例子稍微验证一下。

(1)对数组名作为取地址操作符的操作数得到的值和数组名默认转换成指向第一个元素的指针的值相同。

	int array[3] = {1, 2, 3};
	int *ptr = &array;
	cout << "array = " << array << endl;
	cout << "ptr = " << ptr << endl;

这个时候我们编译的话,编译器一般都会报错的,如下所示。这个时候我们看一下报错的信息就可以知道对数组名取地址得到的结果其实是一个: int(*)[3] ,表示的是这个指针指向的是整个数组对象,也就是说这个指针指向的是:数组起始地址开始的,以 数组长度和sizeof(int)乘积为宽度的一个数据对象(我是这么理解的,大家如果有不同的见解可以在下边留言一起讨论)。sizeof(int)是针对例子程序来分析的,不同的数据类型需要我们更换sizeof的操作数。

(2)对于例子1种的报错信息,我们更换ptr的声明方式来修正一下上边的例子:

	int array[3] = {1, 2, 3};
	int (*ptr)[3]  = &array;
	cout << "array = " << array << endl;
	cout << "ptr =   " << ptr << endl;
	cout << "ptr+1 = " << (ptr + 1) << endl;

运行结果如下:

对于(1)种的报错信息,我们还可以进行下边的修正:

	int array[3] = {1, 2, 3};
	int (*ptr)[3]  = &array;
	int *ptr2 = (int*)&array;
	cout << "array = " << array << endl;
	cout << "ptr =   " << ptr << endl;
	cout << "ptr2  = " << ptr2 << endl;

输出结果如下:

这两种修正方式得到的指针的值时相同的,但是这两个指针的意义却又不尽相同,参照下边的代码:

	int array[3] = {1, 2, 3};
	int (*ptr)[3]  = &array;
	int *ptr2 = (int*)&array;
	cout << "array = " << array << endl;
	cout << "ptr =   " << ptr << endl;
	cout << "ptr2  = " << ptr2 << endl;
	cout << "ptr+1= " << (ptr + 1) << endl;
	cout << "ptr2+1=" << (ptr2 + 1) << endl;

输出的结果如下:

可以看到,虽然array和ptr的值是相同的,但是使用指针加一得到的结果却是完全不同的。对于未经强制转换得到指针的值加一得到的是以整个数组为基本单元,向后移动数组大小的空间得到的指针值。对于强制转换的指针加一相当于偏移一个整形指针的长度。

指针取地址之后的指针值是和普通的指针是不一样的,这个时候的加上1之后的偏移量是一个数组的空间大小。

另外一个数组比较特殊的就是sizeof操作符。sizeof操作符的操作数是数组名的时候,得到的是整个数组的大小,即: int array[10].   sizeof(array)/sizeof(int) = 10;

时间: 2024-10-12 15:37:55

数组名取地址以及数组名作为sizeof操作符的操作数的相关文章

为什么数组名取地址和数组名的取值一样

本文链接:https://blog.csdn.net/Nonpc123/article/details/96431952int ints[20] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200}; ints 和 &ints的值为什么一样这两个看的角度不一样. (1)ints是指针常量 , 即数组首元素ints[0]的地址 . (2)&ints是整个ints[20]的首地址 , 是以整个数组为

对数组名取地址

int a[5]={1,2,3,4,5}; int b[100]; 一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题 问题一:看到一篇文章这么写的..int array[10];int (*ptr)[10];ptr=&array;//这里说明&array是指向数组的指针,但为什么&array是指向数组的指针?答一:对数组名取地址在C标准里面是未定义的行为.由于数组名是右值,而&操作符要求操作数具有具体的内存空间,换言之就是一个变量,因此

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码:

C语言对数组名取地址

你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是对指针进行加减操作

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是

数组名和数组名取地址、指针数组和数组指针的区别

一,首先我们先分析下数组名和数组名取地址的区别. 我们都知道数组名是数组的首地址,然而对数组名取地址又是什么那?看下面一段程序你就会懂的. #include "stdafx.h"     #include<stdio.h>    using namespace std;    void main()    {          int a[5];          printf("%d\n", a);          printf("%d\n

数组名和数组名取地址的区别

数组名和数组名取地址的区别 以下代码会打印出什么样的日志呢? [cpp] view plaincopy #include <stdio.h> int a[2] = {1,2}; int main(){ printf("a = %p\n", a); // I printf("&a = %p\n", &a); // II printf("a + 1 = %p\n", a + 1);// III printf("&

C语言的数组名和对数组名取地址

http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址.现在又这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了. 下面我们来逐步分析,下面是一段验证这个问题的代码 Code: #include<stdio.h> in

数组名a、数组名取地址&amp;a、数组首地址&amp;a[0]、数组指针*p

本文链接:https://blog.csdn.net/loongkingwhat/article/details/78910921 数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址.数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的,即a+i= & a[i