c++如何用new创建一个二维数组??如何创建一个指针数组??以及如何delete
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




