是[n]真的可以与*(a + n)互换 - 为什么sizeof会返回两个不同的答案?

qiu*_*bit 4 c arrays pointers

我在理解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)

我不明白 - 我刚刚做了什么?如何ap不同的对象?(根据sizeof函数的输出来判断)

Vla*_*cow 5

根据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)

  • @qiubit VLA的大小在运行时确定.VLA具有自动存储持续时间,并且每次定义它们的代码块获得控制时确定它们的大小.它是术语"可变长度数组"的含义.:) (2认同)