首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++二维动态数组

C++二维动态数组
EN

Stack Overflow用户
提问于 2010-02-19 13:48:06
回答 5查看 5.4K关注 0票数 3

我试图在构造函数initialize中动态地将一个二维数组赋给一个指针。

代码语言:javascript
复制
FooBar::FooBar()
    : _array( new int[10][10] )
{ }
int **_array;

然而,这并不起作用。我知道多维数组的分配略有不同。有没有人能详细解释一下?

提前谢谢。

EN

回答 5

Stack Overflow用户

发布于 2010-02-20 00:40:44

这里的一些答案说,二维数组是指向其他数组的指针数组。事实并非如此(如果分配的都是数组的数据,那么指针应该存储在哪里!?)。相反,二维数组是由其他数组组成的数组。因此,您必须更改成员的类型:

代码语言:javascript
复制
FooBar::FooBar()
    : _array( new int[10][10] )
{ }
int (*_array)[10];

这是因为new[]返回指向创建的数组的第一个元素的指针。该元素是一个由10个整数组成的数组,因此成员类型会发生变化。如果语法把你吓跑了,可以用temlate来简化它(这个模板相当于boost::identity)。

代码语言:javascript
复制
template<typename T> struct identity { typedef T type; };

FooBar::FooBar()
    : _array( new int[10][10] )
{ }
identity<int[10]>::type *_array;

这实际上就像是一个就地的类型定义函数。当然,与new[]的任何使用一样,它需要在析构函数中放置一个适当的delete[],并在对象被销毁时调用。

如果这不是你想要的,你将不得不分配一个指针数组,就像其他一些答案所说的那样。

但请注意,为了避免进一步的混淆,这些不是多维数组。它们是指针的一维数组,恰好指向其他一维数组。

票数 7
EN

Stack Overflow用户

发布于 2010-02-19 13:57:41

C中的二维数组是指向其他数组的指针数组。

假设我们有3x3数组a (键入的int**):

代码语言:javascript
复制
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**),其余的用于该数组的每个元素。

第一步,分配一个指针数组:

代码语言:javascript
复制
int** a = new int*[10];

第二遍,为a的每个元素分配一个新的数组:

代码语言:javascript
复制
for(int i=0; i<10; ++i)
    a[i] = new int[10];

这将在C++中给出一个“二维”数组。

正如你所看到的,在更高的维度上这可能是相当麻烦的,所以另一个技巧是分配10*10个元素,并将数组用作2D (也称为“投影”):

代码语言:javascript
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2010-02-19 13:51:56

代码语言:javascript
复制
int **array  = new int *[10];

for(int i= 0; i< 10;i++)
{
    array[i] = new int[10];
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2294338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档