C将2D数组转换为双指针可打印意外值

时间:2014-02-05 15:02:45

标签: c++ c arrays pointers

以下程序是打印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;
}

3 个答案:

答案 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;
}