C 引用本質

2021-06-06 08:00:34 字數 1016 閱讀 5105

b=50;

mov eax,dword ptr[b];

mov dword ptr[eax],32h;

int *d=&a;

lea eax,[a];

mov dword ptr[d],eax

*d=60;

mov eax,dword ptr[d]

mov dword ptr[eax],3ch;

以上的**均來自具體的編譯器,怎麼樣,相信了吧,好,讓我再來做乙個或許不怎麼恰當的比擬,你一定編過有關線性表和棧的程式吧,線性表是乙個非常靈活的 資料結構,在他上面有許多的操作,然而棧呢,它是乙個限制性操作的線性表,它的底層操作實際上是由線性表操作實現的。就好比stack與vector的關 系,因此指標和引用的關係就好比線性表和棧的關係,引用也就是受限的指標,它對外的介面和指標雖然並不一樣,但底層是相同的。

下面再來看看引用的乙個重要用途,作為函式的引數傳遞的時候是怎樣的情形:

void swapr(int &a, int &b);

void swapr(int* a, int *b);

int a=10;

int b=20;

swapr(a, b);

lea eax,[a]; 

push eax; //把a的位址壓入堆疊

lea ecx,[b];

push ecx;

call swapr;

swapr(&a, &b);

lea eax,[a];

push eax;

lea ecx,[b];

push ecx;

call swapr; 

怎麼樣,用引用和指標傳遞引數無論是在效率上還是在空間上都是完全一樣的,如果妄想不傳入位址就修改實參的值,簡直就是天方夜譚,這就說明引用的本質就是 指標。畢竟它們的行為都太相似了,如果不是這樣,你還有什麼方法去實現引用嗎?記住,引用只不過是編譯器為你提供的乙個有用且安全的工具,對於機器**可 無法表示它,它把指標一對多的缺點去除,禁止了你的不安全的操作。但回到問題的本源,他們沒有任何區別。

C 引用本質

引用本質究竟是什麼?或者說引用在計算機底層是怎麼實現的?我們來看下面一段c 1 int x 5 2 int y x 3 y 8 在vs2013下反彙編得到下面彙編 對應 1 mov dword ptr x 5 將常量5送入變數x中 對應 2 lea eax,x 取x的位址並送入eax暫存器中 mov...

C 引用本質

首先先來看一段 int main 通過vs除錯模式下檢視反彙編有如下結果 char refvar var 000d2a3c lea eax,var 000d2a3f mov dword ptr refvar eax char ptrvar var 000d2a42 lea eax,var 000d2...

C 引用的本質

引用的意義 1 引用作為其他變數的別名而存在,因此在一些場合可以代替指標 2 引用相對於指標來說具有更好的可讀性和實用性 引用的本質 1 單獨定義普通引用時 必須初始化,說明很像乙個常量 includeusing namespace std 1 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...