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

时间:2016-07-05 09:12:17

标签: c++ arrays c++11 multidimensional-array c++14

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

2 个答案:

答案 0 :(得分:2)

首先,二维数组与指针的指针不同。 虽然后者是指向数组指针(指向数组)的指针,但前者在内存中看起来像这样:

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>>

答案 1 :(得分:1)

  

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

C ++数组要求其维度为常量表达式。对于2D数组(实际上是数组数组),这适用于两个维度。 “宽度”或“高度”也不例外。