【问题标题】:Why do we need to use double pointer to access a 2-D array?为什么我们需要使用双指针来访问二维数组?
【发布时间】:2015-10-03 05:10:52
【问题描述】:

我正在尝试理解多维数组和指针,写了这个小程序来理解这个概念:

#include<stdio.h>
void show(int arr[][2]);
int main()
{
    int z[2][2] = { { 1, 2 },
                    {3, 4 } };
    show(z);
}

void show(int arr[][2])
{

    printf("value of arr = %d", arr);
    printf("\n\nvalue of &arr[0]0] = %d", &arr[0][0]);
}

这个代码片段打印了相同的地址,这是有意义的,但是当我编辑显示函数时:

void show(int arr[][2])
{

    printf("value of *arr = %d", *arr);
    printf("\n\nvalue of arr[0]0] = %d", arr[0][0]);
}

*arr 仍然打印相同的地址,而 arr[0][0] 按预期打印整数值,我想知道为什么我需要使用 **arr 来获取 int 值,如果 arr 正在存储地址它应该用 *arr 取消引用,不是吗?

请帮助我很难理解这个概念..提前谢谢。

【问题讨论】:

  • 这将有助于停止思考地址。指针可以根据内存地址来实现,但它们不是地址,将它们视为地址会在很多方面搞砸你,而不仅仅是这个。
  • @user2357112 能否请您参考一些好的文本,我可以在其中理解这个概念。
  • *array_or_pointer 与 C 中的 array_or_pointer[0] 相同(类型和值)。

标签: c arrays pointers multidimensional-array double-pointer


【解决方案1】:

如果你看一下二维数组的内存布局,事情可能会变得更清楚一些。

您将变量定义为:

int z[2][2] = {{1, 2}, {3, 4}};

内存:

z
|
v
+-----+-----+-----+-----+
|  1  |  2  |  3  |  4  |
+-----+-----+-----+-----+

记忆的另一种看法:

z[0]        z[1]
|           |
v           v
+-----+-----+-----+-----+
|  1  |  2  |  3  |  4  |
+-----+-----+-----+-----+

记忆的另一种看法:

z[0][0]     z[1][0]
|   z[0][1] |    z[1][1]
|     |     |     |
v     v     v     v
+-----+-----+-----+-----+
|  1  |  2  |  3  |  4  |
+-----+-----+-----+-----+

您现在可以看到,就纯内存位置而言,

&z == &z[0] == &z[0][0]

我们也知道,当一个数组衰减到一个指针时,它的值就是数组第一个元素的地址。因此,当在将z 衰减为指针的表达式中使用时,

z == &z[0] == &z (from above)

这很令人费解,但 z&amp;z 评估为相同的地址,即使它们属于不同类型。

当 z 衰减为指针时的类型是int (*)[2]&amp;z 的类型是int (*)[2][2]

来到你的功能,你有:

void show(int arr[][2]) { ... }

相当于:

void show(int (*arr)[2]) { ... }

为什么arr*arr 评估为相同的值?

arrmain 计算为 &amp;z[0]*arrmain 计算为 z[0],从 main 计算为 &amp;z[0][0]

我们已经看到&amp;z[0]&amp;z[0][0] 的值是相同的。因此,show() 中的 arr*arr 计算为相同的地址。

【讨论】:

  • @R Sahu 感谢您的回复。它有帮助
  • @RSahu 哇,令人难以置信的简单、正确且知识渊博
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多