为什么int指针的大小与int数组的大小不同?

int*_*met 3 c arrays pointers sizeof

让我们以下代码:

int x;
int *p = &x;
int t[3];
Run Code Online (Sandbox Code Playgroud)

然后sizeof返回:

sizeof(x) -> 4
sizeof(p) -> 8
sizeof(t) -> 12
Run Code Online (Sandbox Code Playgroud)

我想这sizeof(t)是结果3 * sizeof(int).但是作为t指向他的第一个元素的指针,它的大小应该是sizeof(p).

为什么sizeof(t)返回代表数组的内存块的大小?

谢谢.

Bat*_*eba 12

t是一种int[3]类型,而不是指针类型.

所以它的大小是3 * sizeof(int).

在某些情况下,t 衰减到指针,但这不是那些实例之一.


Vla*_*cow 8

由于变量t被声明为具有数组类型

int t[3];
Run Code Online (Sandbox Code Playgroud)

然后sizeof( t )产生一个等于的值3 * sizeof( int )

C标准(6.5.3.4 sizeof和alignof运算符)

2 sizeof运算符产生其操作数的大小(以字节为单位),

实际上,具有三个类型元素的数组int占用内存等于字节数3 * sizeof( int ).

在少数例外的表达式中,在sizeof运算符数组中使用指定符将转换为指向其第一个元素的指针.

因此,如果您将使用例如以下表达式

sizeof( t + 0 )
Run Code Online (Sandbox Code Playgroud)

然后t在表达式t + 0中将转换为指针,你将得到它sizeof( t + 0 )等于int你的平台上指针的大小,这是8.

来自C标准(6.3.2.1 Lvalues,数组和函数指示符)

3 除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为''array of type''的表达式转换为类型为''指针的表达式键入''指向数组对象的初始元素,而不是左值.如果数组对象具有寄存器存储类,则行为未定义.