【问题标题】:C++: Pointers in 2D-arrays are confusingC++:二维数组中的指针令人困惑
【发布时间】:2019-04-25 23:45:22
【问题描述】:

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

#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 个指向 ints 的指针。但是,在运行代码时,会在 stdout 中写入以下内容:

0x7a665507cf80
0x7a665507cf80
0

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

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

【问题讨论】:

  • 比较 typeid(A)typeid(*A) - 它们会有所不同,因为 A*A 具有不同的类型,即使它们具有相同的值
  • 数组不是指针,指针也不是数组。
  • @molbdnilo 我知道。在这种情况下这很重要吗?
  • @HelloGoodbye 如果你知道这一点,为什么你认为A“应该是一个包含2个指向数组的指针的数组,每个数组应该包含2个指向ints的指针”?跨度>
  • 同理:如果你看任何一个人的队列,你会注意到队列的开头和队列中的第一个人在同一个位置,即使一个队列和一个人是完全不同的东西。

标签: c++ pointers multidimensional-array


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多