我正在阅读这篇文章:How to loop through multi-dimensional arrays quickly

我想了解有关“线性多维数组”的更多信息,但是我找不到任何相关的信息,并且想知道你们中是否有人看到过类似的东西。

具体来说,我想更好地了解如何使用数学访问多维数组(被声明为单维)。听起来很棒!

最佳答案

静态分配

在c中,例如,如果要创建3x4数组,则需要执行以下代码:

int array1[3][4]; // statically allocate 3x4 integer in stack. The memory will be organize like this:
// [[0, 1, 2, 3] // first row
//  [4, 5, 6, 7] // second row
//  [8, 9, 10, 11]


如果声明一个12 int数组,它将是相同的

int array2[12]; // memory will be
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]


因此:array1[2][3] == array[2* (number of columns) + 3] = 11

两者相同,第一个比第二个更容易阅读。编译器知道数组的维数,因此它将为您计算地址。

动态分配

在这种情况下,您不知道数组的维数。创建一个3x4数组将像这样

int **array1 = (int **) malloc(rows * sizeof(int *)); // allocate 4 pointers
for (int i = 0; i < rows; i++) {
  array1[i] = (int *) malloc(columns * sizeof(int)); // allocate memory for each row.
}

// the memory will be organized like this
// array1 [row0pointer, row1pointer, row2pointer]
// some where else in the memory: ... row0 ... row1 ... row2 ..


它不是最优化的,因为您需要内存来存储指针,并且在访问每个成员时都必须通过指针进行访问。
因此,您可以分配具有行*列成员的单个数组:

int *array2 = (int *) malloc(rows * columns * sizeof(int));

// then when you want to access array2[i][j] you can easily access
array2[i * columns + j]


与n维数组相同。

关于c - 多维线性阵列C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39421447/

10-09 20:39