“真正的”多维数组的定义是什么,哪些编程语言支持它们?

11

我读过的大部分编程书籍都有以下这句话:

"X 语言不支持真正的多维数组,但是您可以使用数组的数组来模拟(近似)它们。"

由于我大部分的经验都是用基于 C 的语言编写的,例如 C++、Java、JavaScript、php 等,我不确定什么是“真正”的多维数组。

什么是“真正”的多维数组,哪些语言支持它?如果可能,请提供一个真正的多维数组的代码示例。


据我所知,Fortran-90曾经拥有它。 - Shekhar_Pro
@Shekhar_Pro:我使用过的每个FORTRAN版本(回到66年)都支持多达7个维度。 - user7116
4个回答

8

C#支持真正的多维数组和"锯齿"数组(数组的数组),这可以作为一种替代方案。

// jagged array
string[][] jagged = new string[12][7];

// multidimensional array
string[,] multi = new string[12,7];

锯齿数组通常被认为比多维数组更好,因为它们可以做到多维数组所能做的一切,并且还能做更多。在锯齿数组中,每个子数组的大小都可以不同,而在多维数组中则不行。甚至有一个代码分析规则来证明这一点 (http://msdn.microsoft.com/en-us/library/ms182277.aspx)。


2
谢谢你的回答。我现在明白了什么是真正的多维数组。但是请记住,在C和C++中,即使它们使用数组的数组,子数组的大小也不能不同。另外,C#是唯一支持它们的语言吗? - Jesse Good
"C++子数组的大小必须相同,即使它们使用的是数组的数组。" 不,它们没有使用数组的数组。 - dom0
@dom0 "C++中的子数组尽管使用了数组的数组,但大小仍然不能不同。" 为什么这是不正确的?在C++中,多维数组就是数组的数组。 - Rick
“数组的数组”意味着第一个数组包含一组其他数组(即不同的对象),这在C/C++中并非如此。int[5][2]是一个单独的对象。类似于int*[5]的东西可以被认为是一个数组的数组。 - dom0

0

Common Lisp支持两种类型的数组。

多维数组称为Array,而“一维”数组称为Vector。


0

Java 也使用它们

int[][] a2 = new int[10][5];

这是我发现的一个有趣的用法

String[][] Data;

 //Assign the values, do it either dynamically or statically
 //For first fow
 Data[0][0] = "S"; //lastname
 Data[0][1] = "Pradeep"; //firstname
 Data[0][2] = "Kolkata"; //location

 //Second row
 Data[1][0] = "Bhimani"; //lastname
  Data[1][1] = "Shabbir"; //firstname
  Data[1][2] = "Kolkata"; //location

 //Add as many rows you want

 //printing
 System.out.print("Lastname\tFirstname\tLocation\n");
 for(i=0;i<2;i++)
 {
   for(j=0;j<3;j++)
   {
     System.out.print(Data[i][j]+"\t");
   }
   //move to new line
   System.out.print("\n");
 }

0

不需要阅读Sun和Microsoft网站上的大量文献,这是我从C语言时代记得的。希望这能有所帮助。

简单来说,如果我们只考虑二维数组,那么数组可以表示为二维数组和指针数组。在代码中,这相当于:

int x[15][20];
int *y[15];

在这个例子中,x[5][6]和b[5][6]在语法上都是有效的,并且最终都引用了一个整数。

也就是说,x是一个真正的二维数组:一旦创建它,就会有300个位置(可以包含int类型),已经被设置好了,你可以使用众所周知的下标约定来访问这个矩形(有15行和20列)数组,在这个数组中,你可以通过计算(20*row)+col来访问x[row,col]。

然而,在y的情况下,在定义结构时,只分配了15个指针,但没有初始化。(需要显式地进行初始化)

这种方法(指针数组或“数组的数组”或所谓的锯齿数组)有优点和缺点:

优点:

这个数组的行可以是不同长度的,即y的每个元素不需要指向一个二十个元素的行;一个元素可以指向两个元素,第二个元素可以指向三个元素,第三个元素可以指向零个元素,依此类推。

缺点:

然而,在最理想的情况下,如果y的每个元素都指向一个二十个元素的数组,那么将会有300个整数位置被设置,再加上十个指针单元,这是额外的。

从当前的示例角度来看,上面提供的C#示例(在之前的帖子中)应该足够了。


在你的例子中,x[0] 只会指向第一个数组。此外,因为在 C 中数组会衰减成指针,所以即使它在内存中是连续的,你也不能把 x 视作真正的多维数组,并且只能通过指针算术来访问数组。这就是为什么 C 有 x[][] 语法而没有 x[,] 的原因。 - Jesse Good
@JesseGood:x是一个真正的多维数组,尽管C具有数组衰减。 - Deduplicator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接