我已经看到这些类型的数组有时被视为矩阵。我有一位老师说这是一种简单的方式来看待它,它看起来的真实方式是线性形式。例如:
int a[2][3][2] = {0, 1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11};
您如何以线性方式表示这一点?
答案 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