我试图在构造函数initialize中动态地将一个二维数组赋给一个指针。
FooBar::FooBar()
: _array( new int[10][10] )
{ }
int **_array;然而,这并不起作用。我知道多维数组的分配略有不同。有没有人能详细解释一下?
提前谢谢。
发布于 2010-02-20 00:40:44
这里的一些答案说,二维数组是指向其他数组的指针数组。事实并非如此(如果分配的都是数组的数据,那么指针应该存储在哪里!?)。相反,二维数组是由其他数组组成的数组。因此,您必须更改成员的类型:
FooBar::FooBar()
: _array( new int[10][10] )
{ }
int (*_array)[10];这是因为new[]返回指向创建的数组的第一个元素的指针。该元素是一个由10个整数组成的数组,因此成员类型会发生变化。如果语法把你吓跑了,可以用temlate来简化它(这个模板相当于boost::identity)。
template<typename T> struct identity { typedef T type; };
FooBar::FooBar()
: _array( new int[10][10] )
{ }
identity<int[10]>::type *_array;这实际上就像是一个就地的类型定义函数。当然,与new[]的任何使用一样,它需要在析构函数中放置一个适当的delete[],并在对象被销毁时调用。
如果这不是你想要的,你将不得不分配一个指针数组,就像其他一些答案所说的那样。
但请注意,为了避免进一步的混淆,这些不是多维数组。它们是指针的一维数组,恰好指向其他一维数组。
发布于 2010-02-19 13:57:41
C中的二维数组是指向其他数组的指针数组。
假设我们有3x3数组a (键入的int**):
a[0] (a[0] is of type int*) = [0][1][2]
a[1] (a[1] is of type int*) = [0][1][2]
a[2] (a[2] is of type int*) = [0][1][2]这意味着需要两个分配过程,一个用于指针数组(int**),其余的用于该数组的每个元素。
第一步,分配一个指针数组:
int** a = new int*[10];第二遍,为a的每个元素分配一个新的数组:
for(int i=0; i<10; ++i)
a[i] = new int[10];这将在C++中给出一个“二维”数组。
正如你所看到的,在更高的维度上这可能是相当麻烦的,所以另一个技巧是分配10*10个元素,并将数组用作2D (也称为“投影”):
const int ARRAY_WIDTH = 10;
const int ARRAY_HEIGHT = 10;
int* a = new int[ARRAY_WIDTH * ARRAY_HEIGHT];
// To access a[5][2] you would use:
a[5 + (2 * ARRAY_WIDTH)] = 0;发布于 2010-02-19 13:51:56
int **array = new int *[10];
for(int i= 0; i< 10;i++)
{
array[i] = new int[10];
}https://stackoverflow.com/questions/2294338
复制相似问题