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

  C++中动态分配一维数组是十分常见的事,但会分配一维数组的人并不一定会分配二维数组。因为我想,不到特殊情况,我们可能很少想过要使用动态分配的二维数组。但不管怎么样,只要你是第一次想试着去分配一个二维数组的时候,你或多或少的会想当然地认为二维数组一定是像这样分配的:int m=2, n=3; int** array2D=new int[m][n];。这不是我们的错,因为写多了int n=3; int* array=new int[n];这样的语句容易患上后遗症,难免有犯错的时候。

  有些事情并不像看似的那样简单,就像这里的动态分配二维数组,看下面的程序:

  #include

  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; p="" {<="" ++i)="">

  array2D[i]=new int[n];

  }

  //测试一下

  for(i=0; i<m; p="" {<="" ++i)="">

  for(j=0; j<n; p="" {<="" ++j)="">

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

  }

  }

  for(i=0; i<m; p="" {<="" ++i)="">

  for(j=0; j<n; p="" {<="" ++j)="">

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

  }

  cout《endl;

  }

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

  for(i=0; i<m; p="" {<="" ++i)="">

  delete[] array2D[i];

  }

  //删除行指针数组

  delete[] array2D;

  return EXIT_SUCCESS;

  }

  利用C++二维数组动态分配的特点,我们还可以分配出用静态数组无法实现的不等长二维数组。看下面的例子:

  #include

  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; p="" {<="" ++i)="">

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

  }

  //测试一下

  for(i=0; i<m; p="" {<="" ++i)="">

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

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

  }

  }

  for(i=0; i<m; p="" {<="" ++i)="">

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

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

  }

  cout《endl;

  }

  //删除分配的空间

  for(i=0; i<m; p="" {<="" ++i)="">

  delete[] array2D[i];

  }

  delete[] array2D;

  return EXIT_SUCCESS;

  }

  打印的结果是:

  1

  1 2

  1 2 3

  当然,如果你想一劳永逸,不想这么麻烦地分配来分配去,那么去写个类模板吧,在类模板中重载数组下标运算符,你就可以像使用静态二维数组那样方便地使用你的类了。

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值