引用的理解
轉自:http://blog.csdn.net/wanwenweifly4/article/details/6739687
引用類型到底是什么?它和指針有什么關系?它本身占用內存空間嗎? 帶著這些疑問,我們來進行分析。 先看代碼:
#include <stdio.h> #include <iostream>using namespace std;void main() {int x = 1;int &b = x;}通過匯編查看代碼如下:
9: int x = 1; 00401048 mov dword ptr [ebp-4],1 10: int &b = x; 0040104F lea eax,[ebp-4] 00401052 mov dword ptr [ebp-8],eax可以知道x的地址為ebp-4,b的地址為ebp-8,因為棧內的變量內存是從高往低進行分配的。所以b的地址比x的低。
lea eax,[ebp-4] 這條語句將x的地址ebp-4放入eax寄存器
mov dword ptr [ebp-8],eax 這條語句將eax的值放入b的地址ebp-8中
上面兩條匯編的作用即:將x的地址存入變量b中,這不和將某個變量的地址存入指針變量是一樣的嗎?
所以從匯編層次來看,的確引用是通過指針來實現的。
下面我們通過程序來驗證,我們知道,在程序一層我們只要直接涉及到引用變量的操作,我們操作的總是被引用變量,即編譯器幫我們做了些手腳,總是在引用前面加上*。所以我們要讀取真正的“引用變量的值”,必須采取一定的策略,好吧,我們就按照變量在棧中分布的特點來繞過編譯器的這個特點。
#include <stdio.h> #include <iostream>using namespace std;void main() {int x = 1;int y = 2;int &b = x;printf("&x=%x,&y=%x,&b=%x,b=%x\n",&x,&y,&y-1,*(&y-1));} 輸出結果為:&x=12ff7c,&y=12ff78,&b=12ff74,b=12ff7c
Press any key to continue void main() {int x = 1;int &b = x;printf("&x=%x,&b=%x\n",&x,&b);} 輸出結果為::&x=12ff7c,&b=12ff7c.
b的地址我們沒法通過&b獲得,因為編譯器會將&b解釋為:&(*b) =&x ,所以&b將得到&x。也驗證了對所有的b的操作,和對x的操作等同。
但是我們可以間接通過&y-1來得到b的地址,從而得到b的值:*(&y-1) 從結果可以知道,b的值即x的地址,從而可以知道,從地層實現來看,引用變量的確存放的是被引用對象的地址,只不過,對于高級程序員來說是透明的,編譯器屏蔽了引用和指針的差別。
下面是程序的變量在內存棧中的分布,引用變量一樣也占用內存空間,而且應該是4個字節的空間。
雖然從底層來說,引用的實質是指針,但是從高層語言級別來看,我們不能說引用就是指針,他們是兩個完全不同的概念。有人說引用是受限的指針,這種說法我不贊同,因為從語言級別上,指針和引用沒有關系,引用就是另一個變量的別名。對引用的任何操作等價于對被引用變量的操作。從語言級別上,我們就不要去考慮它的底層實現機制啦,因為這些對你是透明的。所以在面試的時候,如果面試的人問到這個問題,可以先從語言級別上談談引用,深入的話就從底層的實現機制進行分析。而不能什么條件沒有就說:引用就是指針,沒有差別,......之類的回答
、
以下內容摘自網上,覺得挺好的,借用過來
什么是引用?
對象的別名(另一個名稱)。
引用經常用于“按引用傳遞(pass-by-reference)”: void swap(int& i, int& j){int tmp = i;i = j;j = tmp;}int main(){int x, y;// ...swap(x,y);}此處的 i 和 j 分別是main中的 x 和 y。換句話說,i 就是x —— 并非指向 x 的指針,也不是x 的拷貝,而是 x 本身。對 i 的任何改變同樣會影響x,反之亦然。
OK,這就是作為一個程序員所認知的引用。現在,給你一個不同的角度,這可能會讓你更糊涂,那就是引用是如何實現的。典型的情況下,對象 x 的引用i 是x 的機器地址。但是,當程序員寫 i++ 時,編譯器產生增加 x 的代碼。更詳細的來說,編譯器用來尋找x 的地址位并沒有被改變。C 程序員將此認為好像是 C 風格的按指針傳遞,只是句法不同 (1) 將 & 從調用者移到了被調用者處,(2)消除了*s。換句話說,C 程序員會將i 看作為宏(*p),而 p 就是指向 x 的指針(例如,編譯器自動地將潛在的指針解除引用;i++被改變為(*p)++;i = 7 被自動地轉變成*p = 7)。
很重要:請不要將引用看作為指向一個對象的奇異指針,即使引用經常是用匯編語言下的地址來實現的。引用就是對象。不是指向對象的指針,也不是對象的拷貝,就是對象。
?
?以下內容摘自網上,覺得挺好的,借用過來
總結
- 上一篇: 剑指offer 算法 (发散思维能力)
- 下一篇: 用位运算实现四则运算之加减乘除