为什么在声明二维数组时需要硬编码宽度

Why is a hard coded width required when declaring a two dimensional array?

本文关键字:编码 声明 二维数组 为什么      更新时间:2023-10-16
指向

指针的指针似乎是动态声明二维(或多维)数组的唯一方法,除了自己做腿部工作和编码指针算术以从一维数组中创建"假"多维数组。我知道这是这样,但为什么?!

首先,二维数组与指向指针的指针不同。虽然后者是指向指针数组(指向数组)的指针,但前者在内存中如下所示:

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 数组(实际上是数组的数组),这适用于两个维度。"宽度"或"高度"也不例外。