一、答案
一个指针变量,即: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!)