指针的指针似乎是动态声明二维(或多维)数组的唯一方法,除了自己做腿部工作和编码指针算术以从一维数组中创建"假"多维数组。我知道这是这样,但为什么?!
首先,二维数组与指向指针的指针不同。虽然后者是指向指针数组(指向数组)的指针,但前者在内存中如下所示:
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 数组(实际上是数组的数组),这适用于两个维度。"宽度"或"高度"也不例外。