C ++:二维数组中的指针令人困惑

时间:2018-11-23 10:58:20

标签: 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
}

Try the code here!

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

0x7a665507cf80
0x7a665507cf80
0

在我看来,这似乎A中第一个元素的内存地址(打印在第一行标准输出上)与*A中第一个元素的内存地址相同。考虑到A*A显然是两个不同的数组(因为对A*A的解引用给出不同的结果),这怎么可能?

输出的另一种解释是,存储器地址0x7a665507cf80包含值0x7a665507cf80(即,位于该位置的指针,在这种情况下为A指向自身)或0,具体取决于它是从A还是*A访问的,这对我来说真的没有任何意义。

1 个答案:

答案 0 :(得分:8)

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

它不是指向指针的指针,而是1D数组上的2D数组,这一事实意味着A[0]*A访问该数组并返回作为第一行的1D数组。然后,第二次反导取实际值。如果您有int A[x][y][z][t]...,这将概括为nD。

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