sizeof如何与对数组的指针取消引用一起工作?

Abd*_*med 9 c arrays pointers

在这里,我有一个指向4个整数的ptr数组arr的指针。ptr指向整个数组。ptr[0]*ptr指向数组的第一个元素,因此加1即可ptr[0]得出数组第二个元素的地址。

我不明白为什么使用sizeof(ptr[0])给出整个数组的大小16个字节,而不是第一个元素的大小4个字节(ptr[0]指向数组中第一个元素)。

int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 6

OP:ptr[0]指向数组中的第一个元素。

类型混乱。 ptr[0]是一个数组。

ptr 是一个指向int数组4的指针
ptr[0]就像*ptr指针指向数组一样
sizeof(ptr[0])是数组的大小。


使用时sizeof(ptr[0])ptr[0]不会引起“指向数组对象的初始元素的类型为“指向类型的指针”的表达式”转换。(c11dr§6.3.2.13)。使用sizeofptr[0]是一个数组。


Gre*_*ree 5

ptr这是类型pointer to an array of 4 int elements,数组类型在您的平台上大小为16(sizeof(int)*(elemetns的数量))。

我不明白为什么使用sizeof(ptr [0])会使整个数组的大小为16个字节,而不仅仅是第一个元素的大小为4个字节

因为C类型系统具有数组类型。在这里arr*ptr都有。您声明拥有的东西。要在此处获取sizeof int,您应该选择sizeof(ptr [0] [0])-其中ptr [0]的结果为数组。