CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

c++如何用new创建一个二维数组??如何创建一个指针数组??以及如何delete

楼主allen830826($Java)2004-08-02 02:12:44 在 C/C++ / C++ 语言 提问

rt 问题点数:40、回复次数:14Top

1 楼lbsjs(纪舒)回复于 2004-08-02 02:45:23 得分 5

int*   p   =new   int   [10][10]  
  delete   []   p;Top

2 楼lifanxi(Byron)回复于 2004-08-02 03:01:42 得分 15

楼上写的算是什么语法?好像通不过编译唉。  
  这个问题真得不知问了多少次了,建议您搜索一下以前的贴子,这里只做一个简单的重复。  
  1.用两层vector模版直接做。  
  2.用一维数组模拟二维,即int   *   p   =   new   int   [x   *   y];分配一个x   *   y大的数组,然后要用的时候把二维下标映射到一维中,这样做的最大好处是,分配的数组空间是连续的,像一个真正的二维数组,缺点是用起来不像二维数组,得做下标映射。  
  3.先分配一组指向数组的指针,然后为每一个指针赋值,使它指向一块分配出来数组。这样做的好处是用起来(语法上)像二维数组,但实际上分配的内存不像二维数组,它不能保证内存是连续的。这种做法delete时要用循环别忘了。  
  指针数组就是这样呀:  
  int   **   p   =   new   int   *[10];  
  Top

3 楼wansong(LostTemple)回复于 2004-08-02 03:22:13 得分 20

//用new创建一个二维数组,有两种方法,是等价的  
  一:  
  int   (*p)[10]   =   new   int[5][10];  
  二:  
  int   **p   =   new   int[5];  
  for(int   i=0;i<5;i++)  
          p[i]   =   new   int[10];  
   
  //指针数组的创建,也有两种方法  
  一:  
  char   *pa   =   new   char[4];  
  for   (int   i=0;i<4;i++)  
  {  
          pa[i]   =   new   char[8];   //为每个指针都分配8个char元素空间。  
  }  
  二:  
  char   *pa[4];//可以不用new创建  
  for   (int   i=0;i<4;i++)  
  {  
          pa[i]   =   new   char[8];   //为每个指针都分配8个char元素空间。  
  }  
   
   
  //delete二维数组  
  for(int   i=0;   i<5;   ++i)  
          delete   []   p[i];  
  delete   []p;  
   
  //delete指针数组  
  一:  
  for(int   i=0;   i<4;   ++i)  
          delete   []   pa[i];  
  delete   []pa;  
  二:  
  for(int   i=0;   i<4;   ++i)  
          delete   []   pa[i];Top

4 楼wansong(LostTemple)回复于 2004-08-02 03:22:45 得分 0

给分吧Top

5 楼renheihei(请大家注意:用DEV C++作为测试编译器!!!!!!!!!,vc++测试可能通不过!!!!!!!!)回复于 2004-08-02 08:56:11 得分 0

markTop

6 楼yiana1002(新的开始)回复于 2004-08-02 09:04:37 得分 0

upTop

7 楼dupenf(飞跃人生)回复于 2004-08-02 09:11:05 得分 0

这个数据结构很典型,三四楼说得及是。Top

8 楼lingjingqiu(空明流转)回复于 2004-08-02 09:22:31 得分 0

PROXYTop

9 楼yesdo(小兵)回复于 2004-08-02 09:25:25 得分 0

哦。终于明白了。markTop

10 楼baqiao023(篮球小子)回复于 2004-08-02 09:46:57 得分 0

不错,讲得满详细的。有价值收藏一下!Top

11 楼honestguy()回复于 2004-08-02 11:17:07 得分 0

四楼的有些在vc下编译不通过Top

12 楼photnman(唐唐)回复于 2004-08-02 11:21:04 得分 0

是哦,四楼的有地方写错了,估计是笔误  
   
  我转发一个帖子,你看了就都明白了  
  发信人:   nichloas   (nil),   信区:   CPlusPlus  
  标     题:   [FAQ]二维数组new小结  
  发信站:   BBS   水木清华站   (Sat   Jun     7   15:27:42   2003),   转信  
  1.  
          A   (*ga)[n]   =   new   A[m][n];  
          ...  
          delete   []ga;  
  缺点:n必须是已知  
  优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)  
  2.     A**   ga   =   new   A*[m];  
          for(int   i   =   0;   i   <   m;   i++)  
                  ga[i]   =   new   A[n];  
          ...  
          for(int   i   =   0;   i   <   m;   i++)  
                  delete   []ga[i];  
          delete   []ga;  
  缺点:非连续储存,程序烦琐,ga为A**类型  
  优点:调用直观,n可以不是已知  
   
   
  3.     A*   ga   =   new   A[m*n];  
          ...  
          delete   []ga;  
  缺点:调用不够直观  
  优点:连续储存,n可以不是已知  
  4.     vector<vector<A>   >   ga;  
          ga.resize(m);                                               //这三行可用可不用  
          for(int   i   =   1;   i   <   n;   i++)                     //  
                  ga[i].resize(n);                                 //  
          ...  
  缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)  
  优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长  
  5.     vector<A>   ga;  
          ga.resize(m*n);  
  方法3,4的结合  
  6.   2的改进版(Penrose提供,在此感谢)  
          A**   ga   =   new   A*[m];  
          ga[0]   =   new   A[m*n];  
          for(int   i   =   1;   i   <   m;   i++)  
                  ga[i]   =   ga[i-1]+n;  
          ...  
          delete   []   ga[0];  
   
   
          delete   []   ga;  
  缺点:程序烦琐,ga为A**类型  
  优点:连续储存,调用直观,n可以不是已知  
  附:1,2,3,6还有对应的malloc-free版本  
  个人推荐1和4,2可以用4来代替,3,5调用太烦琐,毕竟源程序是拿来看的  
  不是拿来运行的  
  下面是一些错误和没成功的版本  
  1.   A*   ga   =   new   A[m][n];  
      必然错误  
  2.   vector<A[n]>   ga;  
        ga.resize(m);  
        gcc   3.2下编译失败,不知道其它编译器效果如何  
        也不知道标准是否允许  
   
  Top

13 楼photnman(唐唐)回复于 2004-08-02 11:22:01 得分 0

有不全的地方,欢迎大家补充Top

14 楼wansong(LostTemple)回复于 2004-08-02 13:30:24 得分 0

现在已经全部修改通过了的  
   
  #include   <iostream>  
  using   namespace   std;  
   
  void   main()  
  {  
  //用new创建一个二维数组,有两种方法,是等价的  
  //一:  
  int   (*p)[10]   =   new   int[5][10];  
  //二:  
  int   **p   =   new   int*   [5];  
  for(int   i=0;i<5;i++)  
  p[i]   =   new   int[10];  
   
  //指针数组的创建,也有两种方法  
  //一:  
  char   **pa   =   new   char*   [4];  
  for   (int   i=0;i<4;i++)  
  {  
  pa[i]   =   new   char[8];   //为每个指针都分配8个char元素空间。  
  }  
  //二:  
  char   *pa[4];//可以不用new创建  
  for   (int   i=0;i<4;i++)  
  {  
  pa[i]   =   new   char[8];   //为每个指针都分配8个char元素空间。  
  }  
   
   
  //delete二维数组  
  //for一:  
  delete   []p;  
  //for二:  
  for(int   i=0;   i<5;   ++i)  
  delete   []p[i];  
  delete   []p;  
   
  //delete指针数组  
  //for一:  
  for(int   i=0;   i<4;   ++i)  
  delete   []pa[i];  
  delete   []pa;  
  //for二:  
  for(int   i=0;   i<4;   ++i)  
  delete   []pa[i];  
  }Top

相关问题

  • c++中二维数组、一维数组指针、二级数组之间的关系
  • 如何采用c++的语法彻底析构二维数组指针
  • 用指针表示二维数组?
  • 二维数组与二维指针的赋值问题!
  • 关于指针的指针和二维数组的疑问
  • 二级指针 如何转换成 二维数组的指针?
  • 一个C#二维数组问题
  • 请问指针的指针,二维数组,指针数组,之间有何区别
  • 一个二维数组串指针作参数问题
  • 请问如何返回一个二维数组的指针?

关键词

  • 指针
  • 数组
  • 二维
  • ga
  • 分配
  • resize
  • delete
  • 用new创建
  • 方法

得分解答快速导航

  • 帖主:allen830826
  • lbsjs
  • lifanxi
  • wansong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo