我想知道多维数组/矩阵在内存中是如何表示的。
从其他帖子中我了解到计算机使用“行优先”或“列优先”。我明白这两个是如何工作的。但是,我不明白当两行在内存中并排放置时,计算机如何能够区分两行。
换句话说,如果矩阵看起来像:
1 2 3
4 5 6
7 8 9
它将表示为
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
行优先。
计算机如何知道下一行从哪里开始?
此外,计算机将如何在内存中存储 3 维或 4 维数组?
最佳答案
有(至少)两种不同的系统来存储用于不同编程语言的二维(或更多)维数组。
有些语言,例如 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。
关于arrays - 多维数组在内存中的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65854603/