有关动态创建释放二维数组,以及指向数组的指针问题集合

今天写程序,因为涉及到二维数组的动态创建及释放问题,浏览了相关的文章才发现我的思路有些错误;
我一直认为二维数组名就是指针的指针:
       例如:
             int** b;
             int a[2][3];
             b=a; //这句会报错,cannot convert "int[2][3]" into "int**"
这说明这两个地址不是同一类地址,即指向int型指针的指针不同于二维int型数组首地址.

1.
一定要使用指向数组的指针才ok
       例如:
             int (*b)[3];       //注意一定要让b指向一个含有三个指定类型元素的数组
             int a[2][3];
             b=a;               //这样就ok了
以上这些是关于二维数组地址赋值问题
 
另外我发现,dev-C++中不能直接动态创建可变动大小的动态二维数组;
        例如:
             int a=2,b=3;
             new int[a][b];      //不像一维动态数组,这样声明的二维数组会报错
而只能静态创建二维数组
        例如:
             int (*b)[3]=new int[2][3]; 
PS:这里的b是指向整个三维int型数组的指针,而不是指向首元素的指针,因此他是一个更高维的指针,同二维数组名.可以b[1][1]这样访问数组中的元素,因为这里的b是一个行指针,指向二维数组中的每一行。而b[1],b[2]等是指向二维数组的列指针,也就是相当于降了一维。

2.
因此要动态创建可变动大小的数组必须使用网上提到的另一种方法
        例如:
             int a=2,b=3;
             int** c=new int*[a];
             for(int i=0;i<a;i++)     c[i]=new int[b];
             //这样就ok
这里的以一个new创建的是一个指针数组,这个指针数组中的每一个元素指向int型一维数组的首地址,然后再用第二个new创建多个一维int型数组,并将这些一维int型数组首地址赋值给第一个new创建的指针数组中的每一个元素,这样就完成了一个动态的二维数组的创建。

与标准的矩阵不同的是,这里的二维数组的每一行所包含的元素可以是不同的,即不一定是一个长方形的矩阵 如下:
             int a=2,b=3,d=4;
             int** c=new int*[a];
             c[0]=new int[b];       //第一行含有b=3个元素
             c[1]=new int[c];     //第二行含有c=4个元素

而且还可以通过c[0][0]来访问二维数组中的[0][0]元素(已测试),这样与平常使用的二维数组习惯统一起来了,看来指针的指针还是和二维数组元素有很大的联系,只不过使用方式上需要注意的。

上面第一种和第二种动态创建二维数组的区别是,通过指向数组的指针来创建的二维数组是一个标准的矩阵,即每一行所包含的元素的个数都是相同的;而通过第二种方法创建的数组的每一行所包含的元素的个数可以不一致,因此不是一个标准的二维矩阵.

以上是动态的创建一个二维数组;下面是相反的过程,利用delete来释放二维数组 
1.
对于第一种方法创建的标准矩阵形式的二维数组的释放方法是:
              for(int i=0;i<2;i++)
                     delete[3] b[i];
              delete[2]  b;
              b=NULL;
              //未测试,一会回去测试

2.
对于第二种方法创建的为标准二维数组的释放方法如下:
             for(int i=0;i<;i++)              //与创建的顺序完全相反,先释放第二维,再释放第一维
                  delete[b] c[i];               //释放动态创建的第二维int型数组
             delete[a] c;                       //再释放动态创建的第一维int*型指针数组
             c=NULL;

最近喜欢了的博主:
加载中…
为了您的账号安全,请 绑定邮箱

通知

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值