C中2d数组的内存映射

时间:2012-11-30 05:13:55

标签: c multidimensional-array

我对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 CMEMORY MAP for 2d / multidimensional arrays ...

2 个答案:

答案 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图像所示,arrarr[0]都指向相同的内存位置。由于*arrarr[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