C++ 内存中的多维数组结构
我已经看到,这些类型的数组有时被视为矩阵。我有一位老师说,这是一个简单的方法来看待它,它的真实形式是线性的。例如:C++ 内存中的多维数组结构,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,我已经看到,这些类型的数组有时被视为矩阵。我有一位老师说,这是一个简单的方法来看待它,它的真实形式是线性的。例如: int a[2][3][2] = {0, 1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11}; 你将如何用线性的方式来表示这一点 就内存布局而言 int a[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } }, { { 6, 7 }, { 8, 9 }, { 10, 11 } }
int a[2][3][2] = {0, 1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11};
你将如何用线性的方式来表示这一点 就内存布局而言
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]
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]
对于三维示例,您可以使用大小为2*3*2=12的数组b
,并通过b[k+2*(j+3*i)]
访问前一个元素a[i][k]
或者,任何其他重排也可以,例如b[i+2*(j+3*k)]
。最佳选择取决于您主要希望如何遍历阵列
通常,可以转换任何数组
a[0 ... N_1-1][0 ... N_2-1] ... [0 ... N_k-1]
进入一个大小为N_1*N_2*…*的线性阵列b
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*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*…*的线性阵列b
N_k
。实际上,唯一需要更改的是索引函数:因此,当您想要访问元素a[i_1][i_2]时。。。[i_k]
在原始数组中,使用以下内容
b[i_k + N_k * ( i_{k-1} + N_{k-1} * ( ... N_2 * i_1) ...))]
数组是连续存储在内存中的若干元素。
二维数组是数组的数组。
因此,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
数组是连续存储在内存中的若干元素。
二维数组是数组的数组。
因此,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
另请参阅,谢谢您的建议!另请参阅,谢谢您的建议!谢谢大家!@克马斯特!这正是我们要找的!谢谢大家!@克马斯特!这正是我们要找的!谢谢大家!@你的回答对我也有帮助。谢谢@你的回答也帮了我。谢谢你,朋友!很好的解释!谢谢你,朋友!很好的解释!