以下程序是打印9而不是17为什么?
int main()
{
int **ptr;
int i=0, j=0;
int arr[2][2]={{17,9},{7,19}};
ptr=(int**)arr;
printf("%d\n", ptr[0]);
return 0;
}
答案 0 :(得分:8)
数组数组不与指针指针相同。
原因是内存布局完全不同。
对于数组数组:
+-----------+-----------+-----------+-----------+ | arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] | +-----------+-----------+-----------+-----------+
指向指针的指针:
+--------+--------+-----+ | arr[0] | arr[1] | ... | +--------+--------+-----+ | | | V | +-----------+-----------+-----+ | | arr[1][0] | arr[1][1] | ... | | +-----------+-----------+-----+ V +-----------+-----------+-----+ | arr[0][0] | arr[0][1] | ... | +-----------+-----------+-----+
当数组衰减为指针时,您可以使用指向数组的指针:
int (*ptr)[2] = arr;
答案 1 :(得分:1)
此行为的原因是您的程序调用未定义的行为。您正在使用%d
说明符来打印指针类型。使用错误的格式说明符调用UB
请注意,指针类型对象的指针不是2D数组。 数组不是指针,尽管数组名称会衰减指向其第一个元素。
答案 2 :(得分:0)
当指定二维数组时,指向指针肯定没有意义。使用指向数组的指针如下所示,这对于访问数组数组很有用。
int main()
{
int (*ptr)[2]; // ptr is pointer to array of 2 ints
int arr[2][2]={{17,9},{7,19}};
ptr = arr;
printf("%d\n", (*ptr)[0]);
return 0;
}