关于new动态分配数组的一些体会

        今天无意看到这么一个情况,在主函数中动态分配一个二维为数组a,在另一个子函数调用它时不用指定其列数大小,直接传一个指针就行。当时很疑惑,二维数组作形参时不是应该指定列数大小吗?带着疑问,上网查了一些资料和看了书之后,得出一下一些结论:

        new分配二维数组时行的地址不是连续的,比如int**a=new int*[4],分配后a[0],a[1],a[2],a[3]地址是系统随机给的,而不是每个之间相隔一个额定的大小,这是因为new分配地址时不知道第二维的大小,所以不知道a[i]和a[i+1]间应该留多大位置,故a[i]和a[i+1]的地址是系统随机给的(我是这么理解的,不知道是不是这样)。a[i]=new int [4]时,这时候这四个地址和静态一维数组一样是连续分配的,即&a[i][0]&a[i][1]&a[i][2]&a[i][3]这四个地址是连续的,间隔为4.因此不难理解为什么a当参数传递时不用指定列数大小了,因为a[i][j]的地址是根据a[i]+4*(j-1)得出的,而不是根据a[0][0]+i*16+4*(j-1)得到,即a[i][j]的地址和a的起始地址没有关系,而静态的二维数组b[m][n]的b[i][j]的地址根据a[0][0]+i*4*n+4*(j-1)得到,故b作参数传递时必须指定列的大小,不然某个元素的地址无法计算,其值也就无法得到了。而且计算sizeof(a)时其值仅是int的大小4,而不是数组的大小,这说明动态分配时a真正的变成了一个指针。同时我们也可以发现a的大小和a[0]的大小是不一样的,a的值是a[0]的内存中地址位置,而在静态二维数组中,这两个的值都是a[0][0]的地址,是相同的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值