内存中的多维数组结构

时间:2015-05-20 16:14:24

标签: c++ arrays multidimensional-array

我已经看到这些类型的数组有时被视为矩阵。我有一位老师说这是一种简单的方式来看待它,它看起来的真实方式是线性形式。例如:

int a[2][3][2] = {0, 1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11};

您如何以线性方式表示这一点?

3 个答案:

答案 0 :(得分:4)

就内存布局而言,

int a[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } },
                   { { 6, 7 }, { 8, 9 }, { 10, 11 } } };

与:

相同
int b[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

a[i][j][k]相当于b[i * 6 + j * 2 + k]

答案 1 :(得分:2)

对于您的三维示例,您可以使用大小为b的数组2*3*2 = 12,并通过a[i][j][k]访问前一个元素b[k + 2 * ( j + 3* i)]

或者,任何其他重新排列也可以,例如b[i + 2 * ( j + 3* k)]。最佳选择取决于您主要想要遍历数组的方式。

通常,可以翻译任何数组

a[0 ... N_1-1][0 ... N_2-1] ... [0 ... N_k-1]

成为大小为b的线性数组N_1 * N_2 * ... * N_k。在实践中,您唯一需要更改的是索引函数:因此,当您想要访问原始数组中的元素a[i_1][i_2] ... [i_k]时,请使用以下代码

b[i_k + N_k * ( i_{k-1} + N_{k-1} * ( ... N_2 * i_1) ...))]

答案 2 :(得分:0)

数组是一些元素,连续存储在内存中 2D数组是一个数组数组 因此,2D阵列是连续存储在存储器中的多个阵列。因此,2D阵列的所有元素都连续存储在存储器中。

在您的具体示例中,编译器将在此结构中分配内存:

 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
  ------- ------- ------- ------- ------- ---------
   line 0  line 1  line 2  line 3  line 4  line 5
  ----------------------- -------------------------
          block 0                 block 1
  -------------------------------------------------
                      3D array