二维数组的堆分配

知易行难
       ——看似简单的问题你很可能就不会!
以前一直以为二维数组不就是两个一维嘛,从来没有仔细思考,知道今天遇到这个问题,二维数组作为一个类的私有成员,其构造函数从堆中给该二维数组分配内存,居然发现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;
 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值