C ++:2D数组中的指针令人困惑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:2D数组中的指针令人困惑相关的知识,希望对你有一定的参考价值。

有人可以向我解释这里发生了什么吗?考虑一下代码

#include <iostream>

int main()
{
    int A[2][2] = {{0}};

    std::cout << A << std::endl;  // First stdout line
    std::cout << *A << std::endl;  // Second stdout line
    std::cout << *(*A) << std::endl;  // Third stdout line
}

(Qazxswpoi)

在我看来,Try the code here!应该是一个2个指向数组的数组,每个指针应包含2个指向As的指针。但是,在运行代码时,会将以下内容写入stdout:

int

对我来说,这看起来像0x7a665507cf80 0x7a665507cf80 0 中第一个元素的内存地址(打印在第一个stdout行上)与A中第一个元素的内存地址相同。这是怎么可能的,考虑到*AA显然是两个不同的数组(因为解引用*AA得到不同的结果)?

对输出的另一种解释是,内存地址*A要么包含值0x7a665507cf80(即位于该位置的指针 - 在本例中为0x7a665507cf80指向自身)或A,具体取决于它是否从0A访问,对我来说也没有意义。

答案

*A这是一个静态的2D数组,它不是指向指针的指针,它只是一个具有特殊访问权限的一维数组。

事实上,它不是指针,而是1D数组上的2D数组意味着int A[2][2] = {{0}};A[0]访问数组并返回第一行的1D数组。然后第二次去引用得到实际值。如果你有*A,这可以概括为nD。

所以前两个是“相同”的地址,但它们不是同一类型。

以上是关于C ++:2D数组中的指针令人困惑的主要内容,如果未能解决你的问题,请参考以下文章

二维数组中的 NullPointerException

指向 2D 数组的指针如何在幕后工作?

如何成对存储二维数组中的随机字母?

在C#datagrid中显示MATLAB数组

代码中的c ++ 2D向量push_back错误

有没有办法在C中有一个2D数组,它有整数和字符?