【问题标题】:Memory map of 2d array in C [closed]C中二维数组的内存映射[关闭]
【发布时间】:2012-11-30 05:13:55
【问题描述】:

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

我知道,之前也有人问过类似的问题,但他们没有帮助我。不要向我推荐Memory map for a 2D array in CMEMORY MAP for 2d / multidimensional arrays ...

【问题讨论】:

  • “不要让我参考 C 中二维数组的内存映射和二维/多维数组的内存映射......” 为什么不呢?你问了同样的问题,答案还是一样的。数组衰减为指针,数组的地址也是该指针,多维数组上的前缀-* 取消引用返回第一个衰减为指针的低维数组...
  • arr u: 3215469448 中可能存在拼写错误。 u 不需要。我试图解决这个问题,但出现错误too short fix
  • 您需要针对这个完全相同的问题(包括您提供的两个链接)的数千个资源进行自己的研究。投票关闭“请向我解释此代码”过于本地化,尽管是的,也可以说这与您所说的对您没有帮助的问题完全重复。

标签: c multidimensional-array


【解决方案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 相同。

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

同样,如果操作数是 [] 运算符的结果,则 & 运算符和 [] 隐含的一元 * 被评估,结果就像 & 运算符 被删除,[] 运算符被更改为 + 运算符。

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

【讨论】:

    【解决方案2】:

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

    printf("\narr: %u", arr);
    

    显示指针值

    printf("\n&arr: %u", &arr);
    

    显示变量arr 的引用。和我上面说的二维块的顶部地址一样。

    printf("\n&arr: %u", *arr);
    

    arr 也是指向a[0] 的地址的指针,所以*arr 表示对&arr[0] 的解引用。即*&arr[0] = arr

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多