C++内存小问题

问题:

int main(int argc, char* argv[])

{
int a[4]={1,2,3,4};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}

程序运行的结果是:4,2000000


解答:

a指向的是数组第一个元素的地址,指向的是一个int型

&a指向的是整个数组,指向的是一个int [4]型

所以&a+1就是a[3]的下一个元素。

感想:

学习用反汇编也会有很大帮助。

利用工作时间学习汇编,再将这个问题从汇编角度弄懂。

汇编:

int a[4]={1,2,3,4};
00F413BE  mov         dword ptr [a],1 
00F413C5  mov         dword ptr [ebp-10h],2 
00F413CC  mov         dword ptr [ebp-0Ch],3 
00F413D3  mov         dword ptr [ebp-8],4 
int *ptr1=(int*)(&a+1);
00F413DA  lea         eax,[ebp-4] 
00F413DD  mov         dword ptr [ptr1],eax 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值