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

问题描述 投票:4回答:1

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

#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访问,对我来说也没有意义。

c++ pointers multidimensional-array
1个回答
8
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.