我在学c++,在书上找到了这个
array_ptr = new int[3][5][4];
这用于使用 new 为多维数组分配内存。它还指出,虽然第一个维度可以是一个变量,其值在运行时提供,但其他维度必须是常量。 我试着运行这段代码
int *p = new int[3][5][6];
但是显示错误。 有人可以详细说明吗。
最佳答案
这是你想要的:
int (*p)[5][6] = new int[3][5][6];
从 C++11 开始,您可以要求编译器为您推断出 p
的类型:
auto p = new int[3][5][6];
你不需要任何特殊的东西来删除这样的数组:
delete [] p;
类型选择背后的逻辑很简单:
在这一行中:int *p = new int[10]
您正在创建一个 10 整数数组
并且您使用指向 int 的指针
code> 来存储地址。
一般情况下,如果您正在分配一个 N 个 T 数组
(其中 N
是大小,T
是类型) ,您使用 指向 T 的指针
来存储地址。
同样的规则可以应用于多维数组,因为它们实际上是嵌套的一维数组。
当您尝试分配多维数组时:p = new int[4][5][6]
,您正在创建一个包含 4 个数组的 数组,其中包含 5 个数组,每个数组包含 6 个整数
。因此,您需要一个指向由 6 个整数组成的 5 个数组的数组的指针
,即 int (*p)[5][6]
。
换句话说,int [3][4][5]
可以被视为大小为 3
的一维数组。它由类型为 int [4][5]
的其他数组组成。这些数组中的每一个都具有大小 4
并且由类型为 int [5]
的其他数组组成,这些数组又包含 5
int
s.
P.S. 其他答案的作者似乎更喜欢使用 int ***
并分别为每个嵌套数组分配内存。这样做可能看起来很聪明,但实际上它要慢得多而且危险(如果你弄乱了你的内存管理)。该技巧的唯一优点是它提供了我们都习惯使用的便捷界面 (p[z][y][x]
)。
但是有一个更好的解决方案:int *p = new int[x_sz * y_sz * z_sz];
。您需要将 3D 索引转换为 1D 索引(p[x + x_sz * (y + z * y_sz)]
而不是 p[z][y][x]
) 让它工作,但在我看来它仍然更方便(而且绝对更快)。
当然,在实际代码中,您应该使用 std::vector
来存储这样的数组并编写您自己的包装类,它会自动计算索引。
关于c++ - 为多维数组创建内存空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003942/