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 相同。