-4

我对 C 中的二维数组感到困惑。我的代码是:

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 语句如何显示单个位置的地址。只需大致解释这些地址是如何相同的。

我知道,之前也有人问过类似的问题,但他们没有帮助我。不要让我参考C 中 2D 数组的 Memory map2d/多维数组的 MEMORY MAP ...

4

2 回答 2

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]指向同一个内存位置。和 as*arr相同arr[0](与 相同arr)那么很容易看出为什么arr并且*arr相同。

看起来很奇怪的是它&arr也是一样的,通常它应该是变量 arr的位置而不是它指向的位置。原因可以在 C 规范中找到(最后一个 C11 草案中的第 6.5.3.2/3 节):

类似地,如果操作数是 [] 运算符的结果,则 & 运算符和 [] 所隐含的一元 * 都不会被计算,结果就像 & 运算符被删除并且 [] 运算符被更改为+ 运算符。

这意味着,基本上,如果在&数组上使用地址运算符,则只需返回数组的地址。

于 2012-11-30T06:15:39.087 回答
0

首先,arr指向二维数组内存块的顶部地址。这意味着变量arr的地址与二维数组的内存块的地址相同。

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

于 2012-11-30T05:28:04.660 回答