有(至少)两种不同的系统用于存储用于不同编程语言的二维(或更多)维数组。
一些语言,例如 Java,实际上只是创建一个数组数组。每行都存储为一个单独的一维数组。假定的“二维数组”只是另一个一维数组,用于存储各个行的每个一维数组的地址(或内存中的位置)。该系统很容易推广到多维数组(3、4 等)。它还允许“参差不齐”的多维数组,其中每行具有不同的长度。
其他语言(例如 C)将整个二维(或更多)维数组存储在单个连续内存块中。在这种情况下,编程语言实现需要使用一个公式来计算给定坐标的任何元素的位置。对于以行主顺序存储的二维数组,如您所述,行R 和列C 的元素索引的公式是R * COLUMNS + C,其中COLUMNS 是数组。这意味着计算机需要知道数组中有多少列才能评估这个公式。
例如,C 程序员可能希望编写以下函数来计算二维数组中所有元素的总和:
int sum(int array[][], int rows, int cols) {
int total = 0;
for (int r=0; r<rows; r++) {
for (int c=0; c<cols; c++) {
total += array[r][c];
}
}
return total;
}
这是不合法的 C 代码,因为计算机不知道数组中有多少列,因此无法计算元素的位置。
这是相同功能的合法版本:
int sum(int array[][10], int rows, int cols) {
int total = 0;
for (int r=0; r<rows; r++) {
for (int c=0; c<cols; c++) {
total += array[r][c];
}
}
return total;
}
注意数组参数现在是如何被声明为有 10 列的。当然,这个函数的用处远不如前一个,因为它只适用于 10 列的数组。
C 系统可以推广到 3 或 4(或更多)维数组,只要所有大小都预先固定(可能除了第一维)。因此,一个函数可以采用 int array[][10][10][10] 类型的参数,例如,这将是一个“行”数未知但所有其他维度的大小为 10 的四维数组。