二维数组的堆分配
来源:互联网 发布:centos 时间不对 编辑:程序博客网 时间:2024/05/08 04:01
知易行难
——看似简单的问题你很可能就不会!
以前一直以为二维数组不就是两个一维嘛,从来没有仔细思考,知道今天遇到这个问题,二维数组作为一个类的私有成员,其构造函数从堆中给该二维数组分配内存,居然发现C++不支持int ia[4][4] = new int [4][4]。网上找到一些相关资料总结如下:
方法一(使用二级指针):
int **p;
p = new int *[行数];
for(i=0;i<行数;i++)
p[i] = new int[列数];
方法二(使用指针数组):
int *s[MAXLINE];
for(int i=0; i<n; i++)
s[i]= new int[列数];
接下来就可以s[i][j]这样用了
free时再用一次循环
方法三(也是使用指针数组):
——看似简单的问题你很可能就不会!
以前一直以为二维数组不就是两个一维嘛,从来没有仔细思考,知道今天遇到这个问题,二维数组作为一个类的私有成员,其构造函数从堆中给该二维数组分配内存,居然发现C++不支持int ia[4][4] = new int [4][4]。网上找到一些相关资料总结如下:
方法一(使用二级指针):
int **p;
p = new int *[行数];
for(i=0;i<行数;i++)
p[i] = new int[列数];
方法二(使用指针数组):
int *s[MAXLINE];
for(int i=0; i<n; i++)
s[i]= new int[列数];
接下来就可以s[i][j]这样用了
free时再用一次循环
方法三(也是使用指针数组):
typedef int intData[10]; //this length should be known.
intData* p = new intData[20]; //this length needn't be known.()
p[0][0] = 1; //you can use it like 2-D array.
delete[] p;
p[0][0] = 1; //you can use it like 2-D array.
delete[] p;
注意:
1、第三种方法从可读性上更加好一些,写代码也应该尽量采用这种方式;
2、为什么不能二维分配,应该是因为编译器在记录分配数组的大小时只能记录一个长度值(供delete[]使用),比如int* p=int[2];这个2是被记录了的,当多维的时候就不好记录了。但当使用typedef时,定义类型时长度已经被记载,堆分配的时候仍然只需要记录该数组类型指 针的长度。
3、特别注意从数组到指针的转换是合法的,而从指针到数组的转换是非法的。
int ia[2] = {2,1};
int *p = ia; //从数组到指针的转换,合法
int ib[2] = new int[2]; //非法,从指针到数组的转换
所以,对于方法三,如果写成intData p[20] = new intData[20]是非法的,无法通过编译
1、第三种方法从可读性上更加好一些,写代码也应该尽量采用这种方式;
2、为什么不能二维分配,应该是因为编译器在记录分配数组的大小时只能记录一个长度值(供delete[]使用),比如int* p=int[2];这个2是被记录了的,当多维的时候就不好记录了。但当使用typedef时,定义类型时长度已经被记载,堆分配的时候仍然只需要记录该数组类型指 针的长度。
3、特别注意从数组到指针的转换是合法的,而从指针到数组的转换是非法的。
int ia[2] = {2,1};
int *p = ia; //从数组到指针的转换,合法
int ib[2] = new int[2]; //非法,从指针到数组的转换
所以,对于方法三,如果写成intData p[20] = new intData[20]是非法的,无法通过编译
方法四:typedef vector<int> iv(10);
vector<iv> iv2D;
- 二维数组的堆分配
- 变量二维数组的分配
- 二维数组的内存分配
- 为二维数组在堆上分配空间 zz msdn
- C/C++动态分配二维数组(在堆上分配二维数组内存)
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 二维数组的内存分配及删除
- 动态二维数组的分配和释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 动态二维数组的分配与释放
- 二维数组的分配和删除
- 动态二维数组的分配和释放
- Eclipse插件之Spring IDE
- 调用AdvApi32.dll中MD5算法的函数
- 欺骗的艺术----(3)
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- Javascript中最常用的55个经典技巧
- 二维数组的堆分配
- 程序员面试题精选(17):把字符串转换成整数
- gabor特征分类效果
- 应用托管是推动托管服务发展主要动力
- 深入浅出Microsoft.Net定制特性
- 基本变成技巧--方法传值,类型应用
- 委托
- 弹出新窗口代码
- NullObject模式