Cpp / 引用的本质

一、答案

一个指针变量,即:T *const

二、分析

    int a = 0;
    int &b = a;  // int *const pb = &a;
    
    int c = 3;
    int *p = &c;

    b = *p;     // *pb = *p
	int a = 0;
009925F2  mov         dword ptr [a],0		; *(&a) = 0
	int& b = a;
009925F9  lea         eax,[a]  				; eax = &a
009925FC  mov         dword ptr [b],eax  	; *(&b) = &a,实际上 b 就是一个指针变量,里面保存的是 a 的地址。

	int c = 4;
009925FF  mov         dword ptr [c],4  		; *(&c) = 4
	int* p = &c;
00992606  lea         eax,[c]  				; eax = &c
00992609  mov         dword ptr [p],eax  	; *(&p) = &c

	b = *p;
0099260C  mov         eax,dword ptr [b]  	; eax = *(&b), *(&b) == &a,变量 a 的地址赋值给了 eax 。
0099260F  mov         ecx,dword ptr [p]  	; ecx = *(&p), *(&p) == &c,变量 c 的地址赋值给了 ecx 。
00992612  mov         edx,dword ptr [ecx]  	; edx = *(&c),变量 c 的值赋值给了 edx 。
00992614  mov         dword ptr [eax],edx 	; *(&a) = *(&c),变量 c 的值赋值给了变量 a 。

三、其他

汇编代码作用
[a]取变量 a 的地址,即:&a
dword ptr [a]获取变量 a 的值,即:在内存的 a 的地址的位置获取双字大小的数据,即:*(&a) 。
dword ptr [ecx]在内存中 ecx 中的值所代表的地址上的双字大小的数据,即:*ecx 。

 

(SAW:Game Over!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值