C ++:2D数组中的指针令人困惑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:2D数组中的指针令人困惑相关的知识,希望对你有一定的参考价值。
有人可以向我解释这里发生了什么吗?考虑一下代码
#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个指向A
s的指针。但是,在运行代码时,会将以下内容写入stdout:
int
对我来说,这看起来像0x7a665507cf80
0x7a665507cf80
0
中第一个元素的内存地址(打印在第一个stdout行上)与A
中第一个元素的内存地址相同。这是怎么可能的,考虑到*A
和A
显然是两个不同的数组(因为解引用*A
和A
得到不同的结果)?
对输出的另一种解释是,内存地址*A
要么包含值0x7a665507cf80
(即位于该位置的指针 - 在本例中为0x7a665507cf80
指向自身)或A
,具体取决于它是否从0
或A
访问,对我来说也没有意义。
答案
*A
这是一个静态的2D数组,它不是指向指针的指针,它只是一个具有特殊访问权限的一维数组。
事实上,它不是指针,而是1D数组上的2D数组意味着int A[2][2] = {{0}};
或A[0]
访问数组并返回第一行的1D数组。然后第二次去引用得到实际值。如果你有*A
,这可以概括为nD。
所以前两个是“相同”的地址,但它们不是同一类型。
以上是关于C ++:2D数组中的指针令人困惑的主要内容,如果未能解决你的问题,请参考以下文章