首页 > 解决方案 > C++:二维数组中的指针令人困惑

问题描述

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

#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
}

试试这里的代码!

在我看来,这A应该是一个包含 2 个指向数组的指针的数组,每个数组都应该包含 2 个指向ints 的指针。但是,在运行代码时,将以下内容写入标准输出:

0x7a665507cf80
0x7a665507cf80
0

对我来说,这使得 in 中第一个元素的内存地址(打印在第一条 stdout 行上)看起来与 .in 中第一个元素A的内存地址相同*A。这怎么可能,考虑到A并且*A显然是两个不同的数组(因为取消引用A*A给出不同的结果)?

输出的另一种解释是内存地址要么0x7a665507cf80包含值0x7a665507cf80(即位于该位置的指针,在这种情况下,A指向自身)要么对我有感觉。0A*A

标签: c++pointersmultidimensional-array

解决方案


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

它不是指向指针的指针,而是一维数组上的二维数组这一事实意味着A[0]or*A访问该数组并返回第一行的一维数组。然后第二次取消引用获得实际值。如果你有 ,这可以推广到 nD int A[x][y][z][t]...

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


推荐阅读