【问题标题】:Multidimensional arrays structure in memory [duplicate]内存中的多维数组结构[重复]
【发布时间】:2015-08-02 00:32:15
【问题描述】:

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

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

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

【问题讨论】:

  • 另见here
  • 感谢您的建议!

标签: c++ arrays multidimensional-array


【解决方案1】:

数组是多个元素,连续存储在内存中。
二维数组是数组的数组。
因此,二维数组是多个数组,连续存储在内存中。由此可见,二维数组的所有元素都是连续存储在内存中的。

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

 | 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

【讨论】:

  • 谢谢! @cmaster!这正是我们想要的!
【解决方案2】:

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

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


一般来说,可以翻译任何数组

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

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

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

【讨论】:

  • 谢谢朋友!很好的解释!
【解决方案3】:

就内存布局而言,

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]

【讨论】:

  • 谢谢! @Paul R 你的回答也帮助了我。
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 2018-12-29
  • 2021-11-19
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多