数组名通常表示的都是数组首元素的地址
但是有2个例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示是整个数组,所以“&数组名”取出的是整个数组的地址
编写下面的代码方便理解
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr);
printf("sz = %d\n", sz);
printf("arr = %p\n", arr);
printf("&arr[0] = %p\n", &arr[0]);
printf("&arr = %p\n", &arr);
return 0;
}
代码运行结构如下:
在C语言中,sizeof()
是一个操作符(不是函数),用于获取数据类型或变量的字节大小(即占用内存的大小)。这里定义的数组是int(整型)类型,一个整型占4个字节大小,sizeof(arr)是计算整个数组的大小,所以显示的40个字节。
arr和&arr[0]以及&arr,这三种取地址的操作,虽然取出的地址是一样的,但是&arr取出的地址是整个数组的地址,前两种的含义是一样,均代表数组首元素的地址。
下面进行进一步的理解:
int main()
{
int arr[10] = { 0 };
//int sz = sizeof(arr);
//printf("sz = %d\n", sz);
printf("arr = %p\n", arr);
printf("arr = %p\n", arr + 1);
printf("\n");
printf("&arr[0] = %p\n", &arr[0]);
printf("&arr[0] = %p\n", &arr[0] + 1);
printf("\n");
printf("&arr = %p\n", &arr);
printf("&arr = %p\n", &arr + 1);
return 0;
}
运行结果如下:
从上面的结果可知,arr+1和&arr[0]+1的地址只增加了4个字节,说明这两个操作只是取出该数组的第二个元素的地址;而&arr+1的地址却增加了40个字节,再次说明了&arr取出的地址是整个数组的地址。