当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > C++中二维数组的动态分配

C/C++
2009年编程开发语言的使用率
C++对象模型笔记:dynamic binding
cstl -- c语言编写通用数据结构和常用算法库(模仿SGI STL)
子串匹配:不回溯算法
C++ Builder 访问 USB 口的方法
C++中二维数组的动态分配
数组和指针在编译的时候的区别
如何利用doxygen生成pdf文档
有关C++析构函数的异常(Exceptions in Destructors)
C++模板学习之函数对象之谓词
5月编程语言排行榜:D语言风采不再
一个C++类实现文件全盘搜索
C语言编程宝典之一 读书笔记
C语言嵌入式系统编程修炼(内存操作)
C++内存管理
带头结点的双循环链表
有关VA_LIST的用法
C++标准库简介(转)
一个栈类的实现(链栈)
C 引用与指针的比较

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 90 ::
收藏到网摘: n/a

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;
}

 

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