1. 数组名的本质解析
在C语言中,数组名看似简单,实则暗藏玄机。很多初学者在使用数组时,常常对数组名的行为感到困惑。让我们通过实际代码来彻底理解这个重要概念。
1.1 数组名即首元素地址
先看这段验证代码:
c复制#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
return 0;
}
输出结果显示&arr[0]和arr的地址值完全相同,这证明了数组名arr本质上就是数组首元素的地址。
1.2 两个特殊例外情况
但当我们使用sizeof(arr)时,结果却是整个数组的大小(40字节),而非指针的大小(4或8字节)。这是因为存在两个例外情况:
- sizeof(数组名):此时数组名代表整个数组
- &数组名:此时取的是整个数组的地址
为了更清楚地理解,我们进行地址运算测试:
c复制#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("&arr[0] = %p\n", &arr[0]);
printf("&arr[0]+1 = %p\n", &arr[0]+1);
printf("arr = %p\n", arr);
printf("arr+1 = %p\n", arr+1);
printf("&arr = %p\n", &arr);
printf("&arr+1 = %p\n", &arr+1);
return 0;
}
输出结果会显示:
&arr[0]+1和arr+1都增加了4字节(一个int的大小)&arr+1却增加了40字节(整个数组的大小)
关键理解:虽然
&arr[0]、arr和&arr打印的地址值相同,但它们的类型语义不同。&arr的类型是"指向包含10个int的数组的指针",而前两者是"指向int的指针"
