C++的复合类型分为两种:引用和指针
引用就是为对象取一个别名 (”左值引用 lvalue reference”)
举一个小例子
#include <iostream>
//compound Type
int main()
{
int i, &ri = i;
i = 5;
ri = 10;
std::cout << i << " " << ri << std::endl;
getchar();
system("pause");
return 0;
}
在汇编中代码
#include <iostream>
//compound Type
int main()
{
01372420 push ebp
01372421 mov ebp,esp
01372423 sub esp,0DCh
01372429 push ebx
0137242A push esi
0137242B push edi
0137242C lea edi,[ebp-0DCh]
01372432 mov ecx,37h
01372437 mov eax,0CCCCCCCCh
0137243C rep stos dword ptr es:[edi]
0137243E mov eax,dword ptr [__security_cookie (0137B004h)]
01372443 xor eax,ebp
01372445 mov dword ptr [ebp-4],eax
int i, &ri = i;
01372448 lea eax,[i] //这里把i存放eax寄存器中
0137244B mov dword ptr [ri],eax //把寄存器eax的值存放内存地址0137244B中
i = 5;
0137244E mov dword ptr [i],5 //对这个i进行赋值
ri = 10;
01372455 mov eax,dword ptr [ri] //引用是直接寄存器eax赋值
01372458 mov dword ptr [eax],0Ah
std::cout << i << " " << ri << std::endl;
0137245E mov esi,esp
01372460 push offset std::endl<char,std::char_traits<char> > (01371087h)
01372465 mov edi,esp
01372467 mov eax,dword ptr [ri]
0137246A mov ecx,dword ptr [eax]
0137246C push ecx
0137246D push offset string " " (01378B30h)
01372472 mov ebx,esp
01372474 mov edx,dword ptr [i]
01372477 push edx
01372478 mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0137C098h)]
0137247E call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A4h)]
01372484 cmp ebx,esp
01372486 call __RTC_CheckEsp (01371159h)
0137248B push eax
0137248C call std::operator<<<std::char_traits<char> > (01371375h)
01372491 add esp,8
01372494 mov ecx,eax
01372496 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A4h)]
0137249C cmp edi,esp
0137249E call __RTC_CheckEsp (01371159h)
013724A3 mov ecx,eax
013724A5 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A8h)]
013724AB cmp esi,esp
013724AD call __RTC_CheckEsp (01371159h)
getchar();
013724B2 mov esi,esp
013724B4 call dword ptr [__imp__getchar (0137C1F4h)]
013724BA cmp esi,esp
013724BC call __RTC_CheckEsp (01371159h)
system("pause");
013724C1 mov esi,esp
013724C3 push offset string "pause" (01378BD0h)
013724C8 call dword ptr [__imp__system (0137C1F8h)]
013724CE add esp,4
013724D1 cmp esi,esp
013724D3 call __RTC_CheckEsp (01371159h)
return 0;
013724D8 xor eax,eax
}
指针
指针值有四种状态
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针,意味着指针没有指向任何对象
- 无效指针,也就是上述情况之外的其他值
&和*的使用区别
int i = 42;
int &r = i;
int *p;
p = &i;
*p = i;
int &r2 = *p;
011E1E65 mov dword ptr [ebp-4],eax
int i = 42;
011E1E68 mov dword ptr [i],2Ah
int &r = i;
011E1E6F lea eax,[i]
011E1E72 mov dword ptr [r],eax
int *p;
p = &i;
011E1E75 lea eax,[i]
011E1E78 mov dword ptr [p],eax
*p = i;
011E1E7B mov eax,dword ptr [p]
011E1E7E mov ecx,dword ptr [i]
011E1E81 mov dword ptr [eax],ecx
int &r2 = *p;
011E1E83 mov eax,dword ptr [p]
011E1E86 mov dword ptr [r2],eax