我在理解C中的一件事时遇到了问题.我在"ANSI C"中读过像数组a[n]
在哪里的语句a
实际上相当于*(a+n)
.所以这里是我编写的一个小代码片段,用于检查:
#include <stdio.h>
int main(void)
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = a;
printf("sizeof a: %d\n", sizeof(a));
printf("sizeof p: %d\n", sizeof(p));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行代码后,程序输出:
sizeof a: 40
sizeof p: 8
Run Code Online (Sandbox Code Playgroud)
我不明白 - 我刚刚做了什么?如何a
和p
不同的对象?(根据sizeof函数的输出来判断)
根据C标准(6.5.3.4 sizeof和alignof运算符)
2 sizeof运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称.大小由操作数的类型确定.结果是整数.如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.
所以a
定义为10个整数的数组的对象占用的内存范围大小为40个字节,因为它的每个元素又有4个字节的大小(即在你的环境中sizeof(int)等于4).
int a[10] = {0,1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)
对象p
被定义为指针,并由数组的第一个元素的地址初始化a
int *p = a;
Run Code Online (Sandbox Code Playgroud)
在您编译的程序中,指针的大小等于8个字节.
你可以考虑申报
int *p = a;
Run Code Online (Sandbox Code Playgroud)
也喜欢
int *p = &a[0];
Run Code Online (Sandbox Code Playgroud)