知易行难
——看似简单的问题你很可能就不会!
以前一直以为二维数组不就是两个一维嘛,从来没有仔细思考,知道今天遇到这个问题,二维数组作为一个类的私有成员,其构造函数从堆中给该二维数组分配内存,居然发现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;