多维数组在内存中的表示

3

我想了解多维数组/矩阵在内存中的表示方式。

从其他帖子上了解到,计算机使用“行主序”或“列主序”。我已经理解了这两种工作方式。然而,当行在内存中相邻时,我不明白计算机是如何区分两个独立的行。

换句话说,如果矩阵看起来像:

1 2 3
4 5 6
7 8 9

它将被表示为

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

在行主序中。

计算机如何知道下一行从哪里开始?

此外,计算机如何处理将3维或4维数组存储在内存中?

1个回答

2

至少有两种不同的系统用于存储在不同编程语言中使用的二维(或更高维)数组。

一些语言,如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。

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