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

Hel*_*bye 4 c++ pointers multidimensional-array

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

#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
}
Run Code Online (Sandbox Code Playgroud)

(试试这里的代码!)

在我看来,A应该是一个2个指向数组的数组,每个指针应包含2个指向ints的指针.但是,在运行代码时,会将以下内容写入stdout:

0x7a665507cf80
0x7a665507cf80
0
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是第一个元素的内存地址A(在第一个stdout行上打印)与第一个元素的内存地址相同*A.这怎么可能,考虑到这一点,A并且*A显然是两个不同的阵列(因为解除引用A*A给出不同的结果)?

对输出的另一种解释是,内存地址0x7a665507cf80要么包含值0x7a665507cf80(即位于该位置的指针 - 在这种情况下A指向自身的点),或者0取决于是否从中访问,A或者*A也不是对我有意义.

Mat*_*her 8

int A[2][2] = {{0}}; 这是一个静态的2D数组,它不是指向指针的指针,它只是一个具有特殊访问权限的一维数组.

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

所以前两个是"相同"的地址,但它们不是同一类型.