如果2D数组不是双指针,为什么会发生这种情况?

时间:2019-07-06 02:37:16

标签: c++ c arrays pointers

#include <stdio.h>
int main()
{     
  int arr[3][4] = { 
                    { 10, 11, 12, 13 }, 
                    { 20, 21, 22, 23 }, 
                    { 30, 31, 32, 33 } 
                  }; 
  printf("%u, %u", arr, *arr) // Output - 1875181168, 1875181168

}

假设任何2D数组(arr)不是双指针,那么为什么arr&* arr指向相同的地址?

1 个答案:

答案 0 :(得分:7)

如果我们在纸上“绘制”数组a=b ,它将看起来像这样

+-----------+-----------+-----------+-----------+-----------+-----+
| arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] | arr[1][0] | ... |
+-----------+-----------+-----------+-----------+-----------+-----+

由此容易看出,指向数组,数组的第一个元素以及第一个元素的第一个子元素的指针都是相同的。

arr&arr == &arr[0](当然是&arr[0] == &arr[0][0])。

这里的区别是类型:

  • &arr == &arr[0][0]的类型为&arr
  • int (*)[3][4]的类型为&arr[0]
  • 并且int (*)[4]的类型为&arr[0][0]

现在对于int *arr,您必须记住,数组自然会衰减到指向其第一个元素的指针。这意味着*arr将等于arr。并且取消对指针的引用将是所指向的“值”,因此&arr[0]等于*arr),然后等于*(&arr[0],后者又将衰减到arr[0]