Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存中的多维数组结构_C++_Arrays_Multidimensional Array - Fatal编程技术网

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

另请参阅,谢谢您的建议!另请参阅,谢谢您的建议!谢谢大家!@克马斯特!这正是我们要找的!谢谢大家!@克马斯特!这正是我们要找的!谢谢大家!@你的回答对我也有帮助。谢谢@你的回答也帮了我。谢谢你,朋友!很好的解释!谢谢你,朋友!很好的解释!