1

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

我尝试了一些组合,但没有完全正确。

任何帮助将不胜感激。

4

2 回答 2

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.
于 2013-01-16T11:16:46.773 回答
3

这可能不是您要寻找的答案,但您需要的是一个返回类型为(*)[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,一切都按预期工作。除了访问数组所需的语法会有所不同。

于 2013-01-16T11:32:49.143 回答