二维数组的堆分配

来源:互联网 发布: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时再用一次循环

方法三(也是使用指针数组): 
     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;
注意:
    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;
 
原创粉丝点击