c++ - size_t (*B)[N] 和 size_t *B[N] 之间的差异
问题描述
c++中这两行代码有什么区别?
size_t (*B)[N] = new size_t[N][N];
和
size_t *B[N] = new size_t[N][N];
第一个编译正确,但第二行,g++ 给出了这个错误
matrixim.cpp:43:20: error: array must be initialized with a brace-enclosed initializer
43 | size_t *B[N] = new size_t[N][N];
解决方案
size_t *B[N]
这里,B
是一个N
指针数组size_t
size_t (*B)[N]
这里,是一个指向sB
数组的指针N
size_t
这两种结构都可以用来创建近似二维数组的东西,但是它们在内存中的布局非常不同。
size_t *B[N]
看起来像这样:
B +-------------+-------------+-----+-------------+
+--------+ | B[0][0] | B[0][1] | ... | B[0][N-1] |
| B[0] +--->+-------------+-------------+-----+-------------+
+--------+
| B[1] +--->+-------------+-------------+-----+-------------+
+--------+ | B[1][0] | B[1][1] | ... | B[1][N-1] |
| | +-------------+-------------+-----+-------------+
| ... |
| |
+--------+
| B[N-1] +--->+-------------+-------------+-----+-------------+
+--------+ | B[N-1][0] | B[N-1][1] | ... | B[N-1][N-1] |
+-------------+-------------+-----+-------------+
B
N
是指向 的指针数组size_t
,每个指针都指向 的数组的第一个元素N
size_t
。
size_t (*B)[N]
看起来像这样:
B +---------------------------------------------------+
+----+ | B[0] |
| +--->+ +-------------+-------------+-----+-------------+ |
+----+ | | B[0][0] | B[0][1] | ... | B[0][N-1] | |
| +-------------+-------------+-----+-------------+ |
+---------------------------------------------------+
| B[1] |
| +-------------+-------------+-----+-------------+ |
| | B[1][0] | B[1][1] | ... | B[1][N-1] | |
| +-------------+-------------+-----+-------------+ |
+---------------------------------------------------+
| |
| ... |
| |
+---------------------------------------------------+
| B[N-1] |
| +-------------+-------------+-----+-------------+ |
| | B[N-1][0] | B[N-1][1] | ... | B[N-1][N-1] | |
| +-------------+-------------+-----+-------------+ |
+---------------------------------------------------+
这里,B
是一个指向数组数组的第一个元素的N
指针N
size_t
。
推荐阅读
- itext - 从 PdfDictionary 获取字节数组
- javascript - jQuery遍历类获取属性值,然后根据属性值更改显示样式
- ruby-on-rails - Rails/ActiveRecord:我可以与具有不同 id 类型的表建立多态关系吗?
- python - 是否可以使turtle.Screen() 背景透明?
- postgresql - PSQL(postgres 或 redshift)存储变量以提示并将查询写入动态文件名
- kotlin - LibGDX Box2D 物理方向反转
- python - 如何在 Jupyter-Notebook 上显示“HTTP 错误 429”的完整响应?
- spring - 当独占消费者失败时要处理哪个 AmqpEvent 或 AmqpException
- php - Base64_encoder 行为中的安全性
- angular - 更新 Firestore 中所有文档中的地图字段