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