#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指向相同的地址?
答案 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]