指针和引用的区别

经常看到网上有人说引用和指针其实是一样,底层都是指针,也没有人来详细分析一下,今天我们来看一看。

int main()
{
    int a=10;
    int &b=a;
    b=20;
}
   0x00000000004028de <+0>:	push   %rbp
   0x00000000004028df <+1>:	mov    %rsp,%rbp
   0x00000000004028e2 <+4>:	sub    $0x20,%rsp
=> 0x00000000004028e6 <+8>:	mov    %fs:0x28,%rax
   0x00000000004028ef <+17>:	mov    %rax,-0x8(%rbp)              
   0x00000000004028f3 <+21>:	xor    %eax,%eax
   0x00000000004028f5 <+23>:	movl   $0xa,-0x14(%rbp)      ;int a=10;,这里(%rbp)-0x14保存的是a的地址
   0x00000000004028fc <+30>:	lea    -0x14(%rbp),%rax      ;将a的地址保存到rax
   0x0000000000402900 <+34>:	mov    %rax,-0x10(%rbp)    ;将a的地址保存到(%rbp)-10  int &b=a;
   0x0000000000402904 <+38>:	mov    -0x10(%rbp),%rax       ;将rbp-10里边的内容赋值给rax,这里是b,也就是a的地址
   0x0000000000402908 <+42>:	movl   $0x14,(%rax)           ;给rax指向的地址赋值为20(0x14),这里还是a的地址
   0x000000000040290e <+48>:	mov    $0x0,%eax
   0x0000000000402913 <+53>:	mov    -0x8(%rbp),%rdx
   0x0000000000402917 <+57>:	xor    %fs:0x28,%rdx
   0x0000000000402920 <+66>:	je     0x402927 <main()+73>
   0x0000000000402922 <+68>:	callq  0x401160 <__stack_chk_fail@plt>
   0x0000000000402927 <+73>:	leaveq 
   0x0000000000402928 <+74>:	retq   
从以上分析来看,对b的各种操作,还是在a的地址上进行的,所以引用的底层其实也就是个指针而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值