使用new()初始化int [] []

时间:2013-01-16 11:14:20

标签: c++

我是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 [] [];

我尝试了一些组合,但没有做到这一点。

任何帮助将不胜感激。

2 个答案:

答案 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,一切都按预期工作。 除了访问数组所需的语法之外 不同。