#include<stdio.h>
void main()
{
int a[5] = {1, 2, 3, 4, 5};
//数组名的值是数组中第一个元素的内存地址,即a == &a[0],通过取值运算符"*"证明a == &a[0]
printf("%d\n", *(&a[0]));
printf("%d\n", *a);
printf("%d\n", sizeof(a));
//求数组名的长度 sizeof(a) 得到的结果为何与第一个元素地址的长度 sizeof(&a[0]) 不一样?地址的长度是4个字节,数组名的值也是一个地址,可为啥它的长度却是整个数组的长度?
printf("%d\n", sizeof(&a[0]));
//自我尝试解释一下,数组名其实是一个特殊的变量名,跟结构体一样,数组中的各个元素就相当于结构体中的各个成员,只不过数组类型是C语言定义好的结构体类型,不需要我们再次自定义一个结构类型,数组名这个特殊的变量就相当于结构体的变量,这个特殊的变量的长度就和结构体变量的长度一样,是其元素(成员)长度之和,问题是,结构体变量的值是各个成员的值,可数组名这个特殊变量的值为何是一个地址?
}
本帖最后由 jackz007 于 2022-11-22 21:53 编辑 int a[5] = {1, 2, 3, 4, 5} ;
a 属于局部变量,在进入函数 main() 时,系统会在堆栈区为 a 开辟 sizeof(int) * 5 = 20 个字节的空间用于储存 a 的 5 个元素,并进行初始化,a 就是这片存储区的代表,它有两个重要的属性,一个是起始地址,另一个是内存容量(字节数),所以,我们可以用 sizeof(a) 来获取 a 占用的字节数,可以通过 a[0]、a[1] 等来访问数组的元素。这两个属性只是在其作用域,也就是 main() 函数内是完整可见的。当把 a 作为实参,用于调用函数的时候,实际传入函数的,只能是 a 两个属性中的一个,那就是内存地址(指针),而占用存储区的字节数的属性则无法同时传入。所以,在函数内,我们不能通过 sizeof(a) 来获取其实际容量,得到的值只是作为一个指针变量所占用的存储空间的数量,这也是很多人强调指针不是数组的重要原因。
作为数组的 a 确实是一个指针,但是,这个指针很特殊,因为 a 和 & a 的值是完全一样的,这个特性很有用,可以通过取址操作,使 a 升级为多级指针。
|