#includeint main() { int arr[3] = { 0 }; printf("0x%pn", &arr[0]); printf("0x%pn", arr); printf("0x%pn", &arr); return 0; }
运行结果
通过运行结果发现这三个的值是一样的,但是代表的含义是完全不同的。
今天我们就来搞懂这三个的含义。
(1)&arr[0]:
arr[0]是数组arr的首元素,&arr[0],就是对数组首元素取地址。
(2)arr是数组名代表整个空间
那他要怎么代表整个空间呢?
首先给arr存储一个起始地址,然后数组有几个元素,每个元素是什么类型,因此从起始位置开始向后数多少个字节,便得到了一个数组。因此数组名里保存有数据,这个数据就是数组首元素的地址。
(3)&arr
是对整个数组取地址。
虽然与&arr[0]的值是一样的,但是含义是完全不同的。
因此,理解下边程序就很简单了&arr 是整个数组的地址。
&arr[0] 是数组首元素的地址。
#includeint main() { int arr[3] = { 0 }; printf("&arr[0] + 1=0x%pn", &arr[0] + 1); printf("arr+1=0x%pn", arr+1);//int* printf("&arr+1=0x%pn", &arr+1);//int(*)[3] return 0; }


![C语言中&arr[0] 、arr 、&arr C语言中&arr[0] 、arr 、&arr](http://www.mshxw.com/aiimages/31/971181.png)
