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

C++ 为什么在声明二维数组时需要硬编码宽度?,c++,arrays,c++11,multidimensional-array,c++14,C++,Arrays,C++11,Multidimensional Array,C++14,指向指针的指针似乎是动态声明二维(或多维)数组的唯一方法,除了自己做腿部工作和编写指针算法以从一维数组中创建“伪”多维数组之外。我知道是这样的,但为什么 首先,二维数组与指向指针的指针不同。 后者是指向指针数组(指向数组)的指针,前者在内存中类似于: 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],编译器将其重写为

指向指针的指针似乎是动态声明二维(或多维)数组的唯一方法,除了自己做腿部工作和编写指针算法以从一维数组中创建“伪”多维数组之外。我知道是这样的,但为什么

首先,二维数组与指向指针的指针不同。 后者是指向指针数组(指向数组)的指针,前者在内存中类似于:

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*宽度+x)
如您所见,计算时需要宽度(指定的第二个尺寸)

您可以省略函数参数中的第一个维度,因为它们已调整为指针:

int f (int v[3][10])

int f (int v[][10])

int f (int (*v)[100])
int f (int *v[100])
(因为数组调整为函数参数中的指针) 但不一样

int f (int (*v)[100])
int f (int *v[100])
(因为这是一个数组[100](即 调整为指针(指针的数量)

无论如何,如果需要二维数组,我建议您使用
std::vector

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


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

请看一看“数组访问器”和“指针算法”。您可以使用类似于
向量的东西,但是除非你的2D数组不是矩形,否则你最好使用一个向量来做腿部工作。很难回答你的问题,因为很难理解你认为另一个选项是什么。魔术必须有人来做这项艰苦的工作,对吗?你当然可以使用任何你最喜欢的库,对吧?为什么你称之为“假库”?同样在纸上,你们可以在二维表示中写一个二维数组,但除此之外的任何东西都是你们所谓的“伪”。内存是一维的,因此任何更高维的数据结构都必须做一些“伪”操作,这两个维度都需要硬编码(好吧,它们需要是常量表达式)。您可能会将二维数组与指向一维数组的指针混淆。是的,不需要宽度。感谢帮助:)