C ++中的多维数组如何运作?

How do multidimensional arrays in C++ function?

本问题已经有最佳答案,请猛点这里访问。

0

简而言之,C++中的多维数组是数组数组,还是仅仅是一个数组,它表现得像多维数组?

我的一位朋友解释说C++中的数组是简单的指针,多维数组也是常数指针,它们的元素由一个以上的索引(即指针指向一个大数组,元素的偏移用多个索引计算)来处理。

我认为多维数组是指向其他数组的指针的一维数组,因为当将多维数组作为函数参数传递时,我经常使用以下语法:

1
void copy_matrix(int ** matrix);

如果不是,是否可以在C++中创建数组数组,并在编译时赋值每个子数组的值——相当于下列语句的语义:

1
2
3
4
int line[2][2];

line[0] = {100, 100};
line[1] = {200, 200};

上述语句生成编译时错误。我想到的一个快速(未经测试的)黑客是:

2

然而,我相信必须有一个更优雅的方法来达到同样的结果。我希望能清楚地理解这些概念,并感谢任何输入。


大括号列表初始值设定项只能在初始化期间工作,并且不能用于赋值,正如您似乎尝试的那样。

相反,只需一次性初始化多维数组:

1
int line[2][2] = { {100, 100}, {200, 200} };

作为对第一句话的回应:数组是数组,指针是指针,它们不一样。然而,数组确实很容易衰减到指向第一个元素的指针,并且x[n]相当于*(x + n)。这同样适用于多维数组。

数组T[N]在内存中对于Tsizeof(T[N]) == N * sizeof(T)是连续的;因此,数组T[N][M]的数组对于T[N]T是连续的。


C和C++中的多维数组是数组的数组。但是,由于数组只是一个接一个地在内存中排列它的对象,因此数组只是一个接一个地排列数组。因此,如果将其衰减为指针,可以将其视为单个数组。

通过将数组值放在大括号之间(用逗号分隔)初始化数组。初始化数组的方法与初始化数组的方法相同——将数组的值(它们本身的数组)放在大括号中。

所以:

1
2
3
4
 int line[2][2]={
                  { 100, 100 }, // line[0]
                  { 200, 200 }  // line[1]
                };

但没有快捷方式可供分配。你必须一个一个的去做(或者使用一些像memcpy这样的功能)。


0

是后者。多维数组和不规则数组在内存表示和索引解释方式上都存在巨大差异。

int array[L][M][N]这样的多维数组占用一个连续的内存块。访问单个元素array[i][j][k]等同于*(&array[0][0][0]+(i*M+j)*N+k)。查找只涉及一个指针取消引用。

int *** ragged这样的不规则数组是int**指针的一维数组。这些int**指针中的每一个都是int*指针的一维数组,每个都是一个一维的整数数组。这里,array[i][j][k]相当于*(*(*(array+i)+j)+k)。查找涉及三个指针取消引用。


这是一段时间以来,我最后一个编码的C++(更多的Java人现在),但如果我记得正确的多维数组确实是数组的数组。

可以这样初始化数组:int行[2][2]=100,100,200,200

P.S.:方形制动器只是简单化:a[x]与*(a+x)相同,a[x][y]与*(a+x+y)相同。

P.P.S.:略微修正初始化