可能重复:
如何在C++中使用数组?
简单地说,C++中的多维数组是数组的数组,还是它只是一个表现得像多维的单个数组?
我的一个朋友解释说,C++中的数组只是常量指针,多维数组也是常量指针,其元素由多个索引寻址(即,它们是指向一个大数组的指针,元素的偏移量是使用多个索引计算的(。
我相信多维数组是指向其他数组的指针的一维数组,因为当将多维数组作为函数参数传递时,我经常使用语法:
void copy_matrix(int ** matrix);
如果没有,是否可以在C++中创建一个数组数组,并在编译时分配每个子数组的值——相当于以下语句的语义:
int line[2][2];
line[0] = {100, 100};
line[1] = {200, 200};
上面的语句生成了一个编译时错误。我想出了一个快速(未经测试(的破解方法:
int line[2][2];
void assign(int index, int * point, int length) {
for (int i = 0; i < length; i++) {
line[index][i] = point[i];
}
}
assign(0, {100, 100}, 2);
assign(1, {200, 200}, 2);
然而,我相信必须有一种更优雅的方式才能达到同样的效果。我希望能够清楚地理解这些概念,任何意见都将不胜感激。
大括号列表初始值设定项仅在初始化期间工作,并且它不能用于赋值,就像您尝试的那样。
相反,只需一次初始化多维数组:
int line[2][2] = { {100, 100}, {200, 200} };
回应你的第一句话:数组是数组,指针是指针,它们不是一回事。然而,数组确实很容易衰减为指向第一个元素的指针,并且x[n]
等效于*(x + n)
。这也递归地应用于多维数组。
阵列T[N]
在存储器中对于T
和sizeof(T[N]) == N * sizeof(T)
是连续的;因此,阵列T[N][M]
的阵列对于T[N]
和对于T
都是连续的。
C和C++中的多维数组是数组的数组。但是,由于一个数组只是在内存中一个接一个地布置它的对象,所以一个数组数组只是一个接另一个地排列数组。因此,如果将其衰减为指针,则可以将其视为单个数组。
通过将数组的值放在大括号之间(用逗号分隔(来初始化数组。您可以用同样的方式初始化数组数组——将其值(本身是数组(放在大括号中。
因此:
int line[2][2]={
{ 100, 100 }, // line[0]
{ 200, 200 } // line[1]
};
不过,分配没有捷径可走。你必须一个成员接一个成员(或者使用一些类似memcpy
的函数(。
我上次在C++上编码东西已经有一段时间了(现在更像是一个Java人(,但如果我没记错的话,多维数组确实是数组的数组。
您可以这样初始化数组:int line[2][2]={{100100},{200200}};
第页。S.:方形制动器只是简化:a[x]与*(a+x(相同,a[x][y]与*
第页。P.S.:略微更正初始化
简单地说,C++中的多维数组是数组的数组,还是它只是一个表现得像多维的单个数组?
是后者。在多维数组和粗糙数组之间,内存表示和索引的解释方式都存在巨大差异。
诸如int array[L][M][N]
之类的多维数组占用了连续的存储器块。访问单个元素CCD_ 11等同于CCD_。查找只涉及一个指针取消引用。
诸如int *** ragged
之类的不规则数组是int**
指针的一维数组。这些int**
指针中的每一个都是int*
指针的一维数组,这些指针中的每个都是int的一维数组。这里CCD_ 17等价于CCD_。查找涉及三个指针的取消引用。