c++ - 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 个指向int
s 的指针。但是,在运行代码时,将以下内容写入标准输出:
0x7a665507cf80
0x7a665507cf80
0
对我来说,这使得 in 中第一个元素的内存地址(打印在第一条 stdout 行上)看起来与 .in 中第一个元素A
的内存地址相同*A
。这怎么可能,考虑到A
并且*A
显然是两个不同的数组(因为取消引用A
并*A
给出不同的结果)?
输出的另一种解释是内存地址要么0x7a665507cf80
包含值0x7a665507cf80
(即位于该位置的指针,在这种情况下,A
指向自身)要么对我有感觉。0
A
*A
解决方案
int A[2][2] = {{0}};
这是一个静态二维数组,它不是指向指针的指针,它只是一个具有特殊访问权限的一维数组。
它不是指向指针的指针,而是一维数组上的二维数组这一事实意味着A[0]
or*A
访问该数组并返回第一行的一维数组。然后第二次取消引用获得实际值。如果你有 ,这可以推广到 nD int A[x][y][z][t]...
。
所以前两个是“相同”的地址,但它们不是同一类型。
推荐阅读
- android - MVVM - Accessing ViewModel/SQLite in a BroadcastReceiver started from a notification when app is closed
- java - Java Android Studio 获取 JSON 问题
- python - 会话图在构建后为空
- c# - Asp .net 核心项目:Ajax 调用无法到达控制器(400 状态码)
- jestjs - 如何更换快照:Jest 和 WebStorm 2019.1?
- angular - Angular 材质自定义主题
- ios - Deploy app from Xcode without dev account
- python - 如何绘制带有逆变换(实际)值的 graphviz 决策树?
- javascript - 使用表单在数据库中保存/更新设置并使用模板中的这些设置构建 HTML
- sql - 从联合语句插入新表时出现数据转换错误