通过汇编代码看引用和指针的区别

 int main(int argc, char* argv[])
{
 int data = 10;
 int &rData = data;
 int *pData = &data;

 int addr;
 addr = (int)&rData;
 addr = (int)&pData;

 return 0;
}

 

汇编代码

_data$ = -4
_rData$ = -8
_pData$ = -12
_addr$ = -16
_main PROC NEAR     ; COMDAT
; Line 15
 push ebp
 mov ebp, esp
 sub esp, 80     ; 00000050H
 push ebx
 push esi
 push edi
 lea edi, DWORD PTR [ebp-80]
 mov ecx, 20     ; 00000014H
 mov eax, -858993460    ; ccccccccH
 rep stosd


; Line 18 int data = 10;
 mov DWORD PTR _data$[ebp], 10  ; 0000000aH  ;

 Line 19  int &rData = data;
 lea eax, DWORD PTR _data$[ebp]        
 mov DWORD PTR _rData$[ebp], eax

//引用变量存储data的地址


; Line 20   int *pData = &data;
 lea ecx, DWORD PTR _data$[ebp]
 mov DWORD PTR _pData$[ebp], ecx

//指针变量也是存储data的地址


; Line 23  addr = (int)&rData;
 mov edx, DWORD PTR _rData$[ebp]
 mov DWORD PTR _addr$[ebp], edx

//取引用地址实际取的是data的地址


; Line 24  addr = (int)&pData;
 lea eax, DWORD PTR _pData$[ebp]
 mov DWORD PTR _addr$[ebp], eax

//取指针的地址取的是指针变量的地址

 

结论,引用和指针变量虽然使用方法不同,但实际存储的内容相同,即指向变量(data)的地址。不同的是引用随即变为其所指变量的一个“影子”,就连该引用变量的地址 &rData 都和其所指变量的地址 &data 相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值