我想了解多维数组/矩阵在内存中的表示方式。
从其他帖子上了解到,计算机使用“行主序”或“列主序”。我已经理解了这两种工作方式。然而,当行在内存中相邻时,我不明白计算机是如何区分两个独立的行。
换句话说,如果矩阵看起来像:
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;
}