如果二维数组不是双指针,那么为啥会发生这种情况?
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指向同一个地址呢?
【问题讨论】:
arr
和arr[0]
的开头都存在于同一个地址。为什么会出乎意料?
附带说明,要使用 printf
打印 (void *
) 指针,请使用 "%p"
格式。格式说明符和参数类型不匹配会导致未定义的行为。
@chux - 我的问题是围绕 arr 和 *arr 持有相同的值,而不是围绕 arr 指向 arr[0]
arr
不指向arr[0]
。
@chux - 对不起,我的错。我的意思是 arr 和 arr[0] 之间的关系。 arr 指向 arr[0][0]。
【参考方案1】:
如果我们在纸上“绘制”数组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]
,而arr[0]
又将衰减为&arr[0][0]
。
【讨论】:
以上是关于如果二维数组不是双指针,那么为啥会发生这种情况?的主要内容,如果未能解决你的问题,请参考以下文章