在c ++中声明并删除此版本的2D数组

时间:2014-08-15 16:04:15

标签: c++ arrays pointers 2d

int *array[10];
for(int i = 0; i < 10; i++)
    array[i] = new int[10];
//...
void passFunc(int *a[10]) //array containing pointers
{
    //...
}

passFunc(array); 

我试图弄清楚如何声明和删除这个版本的2D数组。我开始使用int **数组,但为了使代码的一部分更容易,我需要切换到* []。谁能帮我吗? 我已经尝试编译我的实际代码(上面的代码只是一个例子),看起来像这样:

int* filedata[LENGTH] = new int*[LENGTH]; //ERROR: array must be initialized with brace- enclosed identifiers.

编辑: 谢谢!

3 个答案:

答案 0 :(得分:1)

像这样的东西

 int** array = new int*[sizeX];
 for(int i = 0; i < sizeX; ++i)
   array[i] = new int[sizeY];

删除

for(int i = 0; i < sizeX; ++i)
   delete [] array[i];
delete [] array;

答案 1 :(得分:0)

如果我已正确理解您的需求,那么分配和释放将显示为

int ** filedata = new int * [LENGTH];

for ( int i = 0; i < LENGTH; i++ ) filedata[i] = new int [LENGTH];

//...

for ( int i = 0; i < LENGTH; i++ ) delete [] filedata[i];
delete [] filedata;

答案 2 :(得分:0)

给出的替代版本:

 int** array = new int*[sizeX];
 int *pool = new int[sizeX * sizeY];
 for(int i = 0; i < sizeX; ++i, pool += sizeY)
   array[i] = pool;

要删除:

 delete [] array[0];
 delete [] array;

使用它的好处是:

  1. 无论列数如何,只需要拨打new[]delete[]两次。在上一个答案中,对newdelete的调用次数取决于列数。这样可以减少碎片,如果列数非常大,也可能会提高速度。

  2. 数据是连续的。您可以使用简单的偏移量从任何其他元素访问二维数组中的任何元素。

  3. 缺点是每行的列数需要相同,否则很难维护。