我是一个 C++ 新手。在学习的过程中,我遇到了这个。
如果我有这样的指针
int (*a)[2][3]
cdecl.org 将其描述为declare a as pointer to array 2 of array 3 of int:
当我尝试
int x[2][3];
a = &x;
这行得通。
我的问题是如何a
在使用 new() 时进行初始化,例如
a = new int [] [];
我尝试了一些组合,但没有完全正确。
任何帮助将不胜感激。
我是一个 C++ 新手。在学习的过程中,我遇到了这个。
如果我有这样的指针
int (*a)[2][3]
cdecl.org 将其描述为declare a as pointer to array 2 of array 3 of int:
当我尝试
int x[2][3];
a = &x;
这行得通。
我的问题是如何a
在使用 new() 时进行初始化,例如
a = new int [] [];
我尝试了一些组合,但没有完全正确。
任何帮助将不胜感激。
您必须分两步完成 - 首先分配一个指向指针的指针数组(动态分配的数组),然后依次分配它们中的每一个。总的来说,我相信一个更好的选择就是简单地使用——这是做这类事情std::vector
的首选方式。C++
这里仍然是一个关于如何实现你想要的例子:
int a**;
a = new int*[2];
for (int i =0; i< 2;++i){
a[i] = new int[3]
}
... use them ...
// Don't forget to free the memory!
for (int i = 0; i< 2; ++i) {
delete [] a[i];
}
delete [] a;
编辑:并按照默认要求 - 矢量版本:
std::vector<std::vector<int> > a(2, std::vector<int>(3,0));
// Use a and C++ will take care to free the memory.
这可能不是您要寻找的答案,但您需要的是一个返回类型为(*)[2][3]
This 的新表达式,这很容易做到;例如,这是 的返回类型new int
[n][2][3]
。这样做,a
将指向 [3] int 数组的 [2] 数组的第一个元素。总而言之,一个三维数组。
问题是它new
没有返回指向顶级数组类型的指针;它返回一个指向数组第一个元素的指针。因此,如果你这样做new int[2][3]
,表达式
会分配一个由 2 个 3 个 int 组成的数组,但它返回一个指向一个由 3 个 int ( int (*a)[3]
) 组成的数组的指针,因为在 C++ 中,数组被破坏了(出于 C 兼容性的原因)。而且没有办法强迫它做其他事情。所以如果你想让它返回一个指向二维数组的指针,你必须分配一个三维数组。(第一个维度可以是 1,这样new [1][2][3]
就可以了,并且有效地只分配一个[2][3]
.)
更好的解决方案可能是将数组包装在 a 中struct
:
struct Array
{
int data[2][3];
};
然后您可以使用new Array
,一切都按预期工作。除了访问数组所需的语法会有所不同。