数组数组和多维数组之间有什么区别?

Joh*_*itb 6 c language-agnostic multidimensional-array

我在C++聊天中与某人进行了语言无关的讨论,他说数组和多维数组是两件事.

但是从我学到的东西来看,多维数组只不过是一个大小相同的其他数组的数组.他特别说

好吧,他们有点在C中,你用嵌套数组模拟多个维度但这只是因为C实际上不支持多维数组

有人可以解释一下"多维数组"的规范计算机科学定义是什么以及为什么C(或抽象定义"数组数组")不符合该定义?

Kon*_*lph 7

以.NET数组为例,很好地说明了这一点:

C#区分以嵌套方式定义的锯齿状数组:

int[][] jagged = new int[3][];
Run Code Online (Sandbox Code Playgroud)

每个嵌套数组可以具有不同的长度:

jagged[0] = new int[3];
jagged[1] = new int[4];
Run Code Online (Sandbox Code Playgroud)

(并注意其中一个嵌套数组根本没有初始化,即null.)

相比之下,多维数组定义如下:

int[,] multidim = new int[3, 4];
Run Code Online (Sandbox Code Playgroud)

在这里谈论嵌套数组是没有意义的,实际上尝试访问multidim[0]将是一个编译时错误 - 你需要访问它提供所有维度,即multidim[0, 1].

它们的类型也不同,正如上面的声明所揭示的那样.

此外,他们的处理完全不同.例如,您可以使用以下类型的对象迭代上面的锯齿状数组int[]:

foreach (int[] x in jagged) …
Run Code Online (Sandbox Code Playgroud)

但迭代多维数组是使用以下类型的项完成的int:

foreach (int x in multidim) …
Run Code Online (Sandbox Code Playgroud)

从概念上讲,锯齿状数组是一个数组数组(...数组数组...无限制),T而多维数组是一个T具有set访问模式的数组(即索引是一个元组).