引用变量和指针变量初探
生活随笔
收集整理的這篇文章主要介紹了
引用变量和指针变量初探
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.?????? 引用變量其實和指針變量在內部實現上是一樣的(包括定義、作為右值等操作)。
2.?????? 引用變量與指針變量本身在符號表中的保存機制不一樣的(符號表中保存變量的名字以及其地址)。指針變量保存的地址是指針變量自身的地址、而引用變量保存的是其引用對象的地址值。(這個結論也可以用來說明引用的一些特性:聲明時就要初始化,因為其符號表中保存的地址要用其對象的地址,對象不初始化就沒有分配內存,沒有地址;引用的對象初始化后不能被改變了,因為符號表本身創建了之后是不能再被修改的。)??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
下面看一下編譯器是如何處理指針和引用的:
????
int i = 10;004113EE mov dword ptr [i],0Ahint* p = &i;004113F5 lea eax,[i]004113F8 mov dword ptr [p],eaxint &r = i;004113FB lea eax,[i]004113FE mov dword ptr [r],eax //指針和引用的保存的都是對象的地址,本質上是一樣的int k = i;00411401 mov eax,dword ptr [i]00411404 mov dword ptr [k],eaxint m = *p;00411407 mov eax,dword ptr [p]0041140A mov ecx,dword ptr [eax]0041140C mov dword ptr [m],ecxint n = r;0041140F mov eax,dword ptr [r]00411412 mov ecx,dword ptr [eax] //變量r的值其實是地址,只是編譯器在其作為右值時,做了一步轉化00411414 mov dword ptr [n],ecxcout<<(&r)<<endl;004138A1 mov esi,esp004138A3 mov eax,dword ptr [__imp_std::endl (4182ACh)]004138A8 push eax 004138A9 mov edi,esp004138AB mov ecx,dword ptr [r] //對r進行取址時,編譯器其實是取的值,也就是之前變量i的地址004138AE push ecx 004138AF mov ecx,dword ptr [__imp_std::cout (4182A0h)]004138B5 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A4h)]004138BB cmp edi,esp004138BD call @ILT+335(__RTC_CheckEsp) (411154h)004138C2 mov ecx,eax004138C4 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A8h)]004138CA cmp esi,esp004138CC call @ILT+335(__RTC_CheckEsp) (411154h)?
?
?
轉載于:https://www.cnblogs.com/ripya/archive/2012/06/06/2537997.html
總結
以上是生活随笔為你收集整理的引用变量和指针变量初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TFS 路径...已在工作区...
- 下一篇: 让win7提速几倍的10个方法