C语言 为什么我们需要使用双指针来访问二维数组?



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

#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("nnvalue of &arr[0]0] = %d", &arr[0][0]);
}

这段代码打印了相同的地址,但当我编辑show函数时:

void show(int arr[][2])
{
    printf("value of *arr = %d", *arr);
    printf("nnvalue of arr[0]0] = %d", arr[0][0]);
}

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

请帮助我真的很难理解这个概念…

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

变量定义为:

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&z是不同的类型,但它们的计算结果却是相同的。

z衰变为指针时的类型为int (*)[2]&z的类型为int (*)[2][2]

到你的功能,你有:

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

相当于:

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

为什么arr*arr的值相同?

arrmain求值为&z[0]main求值为z[0], CC_14求值为&z[0][0]

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

相关内容

  • 没有找到相关文章

最新更新