首页 > 解决方案 > 为什么对二维数组的间接应用会给出一个指针?

问题描述

在阅读了这个网站上的一些帖子后,我意识到 C 中的数组不仅仅是我最初认为的常量指针,而且它本身是一种独特的类型,但在大多数情况下,数组“衰减”为指向第一个元素的常量指针数组。由于这些新信息,我的脑海中出现了一个问题。假设我们有一个二维A[10][10]。为什么表达式 * A的结果是指向数组第一个元素的指针?我认为在这个表达式中,A衰减为指向数组A[0][0]的第一个元素的常量指针,然后间接的应用应该给我们A[0][0]的值,但实际上它仍然给了我们数组第一个元素的地址。当然,我的逻辑或我对数组或指针的理解有问题,那么我在哪里弄错了?

提前致谢。

标签: cpointersmultidimensional-arrayindirection

解决方案


*A 或 A[0] 本身是一个包含 10 个元素的数组,并且数组始终由指向其第一个元素的指针表示。然而,A[10][10](假设是一个整数数组)实际上是一个内存块,可容纳 100 个整数,第一行的 10,然后是第二行的 10,依此类推。但是如果表达式 *A 或 A[0] 将返回一个 int 而不是一个 ptr 到该行,那么就不可能使用表达式 A[0][0],对吧?

然而,因为这样的多维数组是一个单一的内存块,也可以将它转换为一个指针,然后用这种表达式访问它:

((int *)A)[iRow * 10 + iCol];

这相当于表达式:

A[iRow][iCol];

但是,如果以这种方式声明的 2D 数组是可能的:

int main()
{
    int A[10][10] = { 0 };
    A[9][9] = 9999;
    printf("==> %d\n", ((int *)A)[9 * 10 + 9]); //==> 9999
    return 0;
}

如果内存可能由单独的字节块组成(可能需要多次调用 malloc),则不是这种表达式:

int * A[10]; // or
int ** A;

推荐阅读