C++中二维数组的动态分配


作者:   来源:csdn博客   公布者:admin

时间:2009-04-23 13:55:03   点击:115



C++中一维数组的动态分配十分经常使用,但C++刚開始学习的人可能非常少想过要使用动态分配的二维数组,或者自觉得二维数组就是这样分配的(至少我自己開始的时候就这样觉得):int m=2, n=3; int** array2D=new int[m][n];。这全然是我们写多了像int n=4; int* array=new int[n];这种语句留下的后遗症,纯粹是由于惯性太大刹都刹不住,就像某同学学完“一二三”要写“万”一样。

事实往往不是这么简单,看以下的正确方法就知道了:

#include <iostream>

using std::cout;

using std::endl;

int main() {

 int i, j;

 int m=2, n=3;

 //分配行指针数组

 int** array2D=new int*[m];

 //为每一行分配空间

 for(i=0; i<m; ++i) {

  array2D[i]=new int[n];

 }

 //能够略微測试一下

 for(i=0; i<m; ++i) {

  for(j=0; j<n; ++j) {

   array2D[i][j]=i+j;

  }

 }

 for(i=0; i<m; ++i) {

  for(j=0; j<n; ++j) {

   cout<<array2D[i][j]<<"/t";

  }

  cout<<endl;

 }

 //删除每一行分配的空间

 for(i=0; i<m; ++i) {

  delete[] array2D[i];

 }

 //删除行指针数组

 delete[] array2D;

 

 return EXIT_SUCCESS;

}

 

利用C++二维数组动态分配的特点,我们还能够分配出用静态数组无法实现的不等长二维数组,想要多少就分配多少。看以下的样例:

#include <iostream>

using std::cin;

using std::cout;

using std::endl;

int main() {

 int i, j;

 int m=3;

 int n[3]={1, 2, 3};

 //行指针数组

 int** array2D=new int*[m];

 

 //每行分配不一样多的空间

 for(i=0; i<m; ++i) {

  array2D[i]=new int[n[i]];

 }

 //測试一下

 for(i=0; i<m; ++i) {

  for(j=0; j<n[i]; ++j) {

   array2D[i][j]=j+1;

  }

 }

 for(i=0; i<m; ++i) {

  for(j=0; j<n[i]; ++j) {

   cout<<array2D[i][j]<<"/t";

  }

  cout<<endl;

 }

 

 //删除分配的空间

 for(i=0; i<m; ++i) {

  delete[] array2D[i];

 }

 delete[] array2D;

 

 return EXIT_SUCCESS;

}

 

当然,假设你想一劳永逸,不想这么麻烦的分配来分配去,那么去写个类模板吧,在类模板中重载数组下标运算符,你就能够像使用静态数组一样使用你的类了。