静态二维数组与动态二维数组的内存布局

本文探讨C++中的静态二维数组和动态二维数组在内存布局上的差异。通过示例代码,解释了静态二维数组中,`p+1`表示行地址转换为列地址,而`&p[i]`则从列地址转向行地址的计算。对于动态二维数组,`p+1`直接指向数组元素,`&p[i]`表示单元地址。同时,文章还展示了动态二维数组的内存分配与释放过程。
摘要由CSDN通过智能技术生成
1,二维数组:
内存布局示例:

点击(此处)折叠或打开

  1. int main()
  2. {
  3.     int p[3][4];
  4.     p[1][0]=123;

  5.     /*
  6.      1, p+1是二维数组p中序号为1的行的首地址,而*(p+1)并不是p+1单元的内容,*(p+1)可以理解为由行地址的计算转向了列地址的计算。
  7.      如:*(p+1)表示第1行,第0列的地址。
  8.      2, 不要把&p[i]简单的理解为p[i]单元的地址,因为并没有给p[i]分配内存。&p[i]可以理解为由当前的列地址计算转向了行地址计算(&(*(p+i))=p+i)
  9.      */

  10.     printf("%x\n%x\n%x\n%x\n",p[1],p+1,&p[1][0],&p[1]);
  11.     
  12.     return 0;
  13. }
输出:


2,指向指针的指针:

内存布局示例:

  1. int main()
  2. {
  3.     int **p=newint*[3];
  4.     p=new int*[3];
  5.     p[0]=newint[4];
  6.     p[1]=newint[4];
  7.     p[2]=newint[4];
  8.     /*
            1, p+1是二维数组p中序号为1的行的首地址,而*(p+1)是p+1单元的内容。
            2, &p[i]可以理解为p[i]单元的地址。
        */

  9.     printf("%x\n%x\n%x\n%x\n",p[1],p+1,&p[1][0],&p[1]);
  10.     
  11.     delete[] p[0];
  12.     delete[] p[1];
  13.     delete[] p[2];
  14.     delete[] p;

  15.     return 0;
  16. }
输出:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值