我对C中的2d数组感到困惑。我的代码是:
main()
{
int i, j;
int arr[3][4] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 0, 1, 6 }
};
printf("\narr: %u", arr);
printf("\n&arr: %u", &arr);
printf("\n*arr: %u", *arr);
}
以上程序的输出是:
arr u: 3215469448
&arr: 3215469448
*arr: 3215469448
现在告诉我所有3个printf语句如何显示单个位置的地址。 只是解释一下这些地址是如何相同的。
我知道,早些时候也提出了类似的问题,但他们并没有帮助我。不要将我推荐给Memory map for a 2D array in C和MEMORY MAP for 2d / multidimensional arrays ...
答案 0 :(得分:1)
在内存中,您的数组就像这样布局
Low address High address
+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 6 |
+---+---+---+---+---+---+---+---+---+---+---+---+
^ ^ ^
| | |
arr[0] arr[1] arr[2]
^
|
arr
如上面粗糙的ASCII图像所示,arr
和arr[0]
都指向相同的内存位置。由于*arr
与arr[0]
相同(与arr
相同),因此很容易理解arr
和*arr
为何相同。< / p>
可能看起来很奇怪的是&arr
也是一样的,通常它应该是变量 arr
的位置而不是它所指向的位置。原因可以在C规范中找到(上一份C11草案中的§6.5.3.2/ 3):
同样,如果操作数是[]运算符的结果,那么&amp;操作员也不 评估[]所暗示的一元*,结果就好像&amp;操作者 被删除,[]运算符被更改为+运算符。
这意味着,基本上,如果在数组上使用地址运算符&
,只需返回数组的地址。
答案 1 :(得分:0)
首先,arr
指向2d阵列内存块的顶部地址。这意味着变量arr
的地址与2d数组的内存块地址相同。
printf("\narr: %u", arr);
显示指针值
printf("\n&arr: %u", &arr);
显示变量arr
的引用。它与我上面说的2d块的顶部地址相同。
printf("\n&arr: %u", *arr);
arr
是指向a[0]
的指针地址的指针,因此*arr
表示&arr[0]
的解除引用。即*&arr[0]
= arr
。