在这里,我有一个指向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)
OP:
ptr[0]指向数组中的第一个元素。
类型混乱。 ptr[0]是一个数组。
ptr 是一个指向int数组4的指针。
ptr[0]就像*ptr将指针指向数组一样。
sizeof(ptr[0])是数组的大小。
使用时sizeof(ptr[0]),ptr[0]不会引起“指向数组对象的初始元素的类型为“指向类型的指针”的表达式”转换。(c11dr§6.3.2.13)。使用sizeof,ptr[0]是一个数组。
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]的结果为数组。