如果二维数组不是双指针,那么为啥会发生这种情况?

Posted

技术标签:

【中文标题】如果二维数组不是双指针,那么为啥会发生这种情况?【英文标题】:If a 2D array is not a double pointer , then why does this happen?如果二维数组不是双指针,那么为什么会发生这种情况? 【发布时间】:2019-07-06 02:37: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


假设任何一个二维数组(arr),都不是双指针,那为什么arr & *arr指向同一个地址呢?

【问题讨论】:

arrarr[0] 的开头都存在于同一个地址。为什么会出乎意料? 附带说明,要使用 printf 打印 (void *) 指针,请使用 "%p" 格式。格式说明符和参数类型不匹配会导致未定义的行为 @chux - 我的问题是围绕 arr 和 *arr 持有相同的值,而不是围绕 arr 指向 arr[0] arr 不指向arr[0] @chux - 对不起,我的错。我的意思是 arr 和 arr[0] 之间的关系。 arr 指向 arr[0][0]。 【参考方案1】:

如果我们在纸上“绘制”数组arr,它会是这样的

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

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

也就是&amp;arr == &amp;arr[0]&amp;arr[0] == &amp;arr[0][0](当然是指&amp;arr == &amp;arr[0][0])。

这里的区别在于类型:

&amp;arr 属于 int (*)[3][4] 类型 &amp;arr[0] 属于 int (*)[4] 类型 而&amp;arr[0][0] 的类型为int *

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

【讨论】:

以上是关于如果二维数组不是双指针,那么为啥会发生这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

为啥会发生这种双释放错误?

C语言指针变量为啥要赋初值?

二维数组名不能赋值给二级指针- -

C语言中的二维数组名是一个二重指针吗?

C++中的双指针向量

无法使用双指针作为函数参数传递二维数组[重复]