我是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;
这有效。
我的问题是,当使用new()时,如何使用
来初始化a
a = new int [] [];
我尝试了一些组合,但没有做到这一点。
任何帮助将不胜感激。
答案 0 :(得分:5)
您必须分两步完成 - 首先分配指针数组(动态分配的数组),然后依次分配每个指针。总的来说,我认为更好的选择就是使用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.
答案 1 :(得分:3)
这可能不是你要找的答案,但你是什么
need是一个新的表达式,其返回类型为(*)[2][3]
这个
这很简单;例如,这是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]
。)
更好的解决方案可能是将数组包装在struct
:
struct Array
{
int data[2][3];
};
然后您可以使用new Array
,一切都按预期工作。
除了访问数组所需的语法之外
不同。