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

If a 2D array is not a double pointer , then why does this happen?

本文关键字:为什么 情况 数组 2D 指针 如果      更新时间:2023-10-16
#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引用相同的地址?

如果我们在纸上"绘制"数组arr,它将看起来像这样

+-----------+-----------+-----------+-----------+-----------+-----+ |到达[0][0] |到达[0][1] |到达[0][2] |到达[0][3] |到达[1][0] |... | +-----------+-----------+-----------+-----------+-----------+-----+从

这里应该很容易看出,指向数组、数组的第一个元素和第一个元素的第一个子元素的指针都是相同的。

也就是说,&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]反过来将衰减到&arr[0][0]