为什么在声明二维数组时需要硬编码宽度
Why is a hard coded width required when declaring a two dimensional array?
指向
指针的指针似乎是动态声明二维(或多维)数组的唯一方法,除了自己做腿部工作和编码指针算术以从一维数组中创建"假"多维数组。我知道这是这样,但为什么?!
首先,二维数组与指向指针的指针不同。虽然后者是指向指针数组(指向数组)的指针,但前者在内存中如下所示:
char v[2][3] = {{1,3,5},{5,10,2}};
Content: | 1 | 3 | 5 | 5 | 10 | 2
Address: v v+1 v+2 v+3 v+4 v+5
为了访问v[x][y]
,编译器将其重写为: *(v + y * WIDTH + x)
如您所见,需要 WIDTH(指定的第二个维度)来进行计算。
您可以省略函数参数中的第一个维度,因为它们已调整为指针:
int f (int v[3][10])
与
int f (int v[][10])
并且与
int f (int (*v)[100])
(由于数组被调整为函数参数中的指针)但与
int f (int *v[100])
(因为这是一个数组[100](即调整为指针)的指针)
无论如何,如果您需要二维数组,我建议您使用std::vector<std::vector<Type>>
。
为什么在声明二维数组时需要硬编码宽度?
C++数组要求其维度是常量表达式。对于 2D 数组(实际上是数组的数组),这适用于两个维度。"宽度"或"高度"也不例外。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 如何确定我已使用非编码文件到达 EOF?
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- 在编码时在类中声明非静态常量数据成员是否合适?
- 为什么在声明二维数组时需要硬编码宽度