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

Din*_*esh 0 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;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 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;
Run Code Online (Sandbox Code Playgroud)