c 引用的內部機制

2021-09-30 04:32:09 字數 1740 閱讀 8117

q1

:引用是別名,引用必須初始化。

為什麼必須被初始化呢?

q2#include

using namespace std;

int main()

int main()

{int x=5,y=10;

swap(x,y);

cout<<"after swap: x="<

引用不能為空(必須初始化),現在要想讓引用指向在堆中開闢的一塊記憶體,保險起見,可以這樣:

int* pint=new int;

if(pint!=null)

int& rint=*pint;     //

從這看,引用又是個什麼東西呢?

引用這個問題困擾我很久很久了,希望在這裡能得到解答。

如果哪位兄台在網上哪個地方或者那本書上發現有講得好的,不妨推薦一下,多謝了。

**:這幾天一直在思考一些問題,就是引用變數在一些教材上的說法是乙個變數的別名,那麼引用變數本身是否占用空間呢?

比如說:(本人使用的是

vc++6.0

編譯器)

int a = 10;

int & r = a;

cout << &a << endl;

cout << &r << endl;

從上面的例子當中可以看出:它們得出的結果是相同的,這時便會有人說,r和

a所占用的記憶體空間是相同的,因為列印出來的位址是相同的。所以這些教材上對於引用變數的操作,稱之為宣告乙個引用變數,而非定義。因為教材的編寫者認為引用變數並不占用空間。

但是,如果你使用偵錯程式除錯一下,看一下彙編的**,就會產生新的迷惑了。

00401040pushebp

00401041movebp,esp

00401043subesp,48h

00401046pushebx

00401047pushesi

00401048pushedi

00401049leaedi,[ebp-48h]

0040104cmovecx,12h

00401051moveax,0cccccccch

00401056rep stosdword ptr [edi]

5:int a = 10;

00401058mov

dword ptr [ebp-4],0ah

6:int & r = a;

0040105fleaeax,[ebp-4]

00401062movdword ptr [ebp-8],eax

從這段彙編**來看,r和

a的空間並不相同,那這又怎麼解釋呢?

基於此,我得出了乙個非常合理的解釋:

如果定義(我認為引用變數占用空間,故稱之為定義)乙個引用變數,這個時候引用變數實際上在記憶體中已經申請了乙個空間,是

4個位元組的(

32bit

系統中),它本身和指標是相同的。也就是說引用和指標對於編譯器本身來說操作是相同的,只是對於使用者來說操作不同而已。

接下來又會有人問:那麼為什麼上面程式的結果列印出來的位址是相同的呢?

其實這只是編譯器給你的假象而已。當你將

r引用給了

a,當想要列印

&r的時候,編譯器會自動將其引用的物件的位址列印出來,也就是將

a的位址列印出來,這也就是它們列印結果相同的原因了。

注:以上的解釋都是本人的研究結果,並沒有經過官方的證實,如果哪為網友對此有新的看法,不吝賜教,非常感謝!

**:

三 C 引用機制

思考 對於一段連續的儲存空間只能有乙個別名嗎?肯定不是,因此我們可以給同乙個連續的儲存空間取多個別名,這就誕生了c 中的引用機制 示例 exp 1.cpp include int main int argc,char argv 執行結果 可見,a和b指向了同一記憶體塊!tip 普通引用在宣告時必須用...

R 的內部機制

在前面的章節中,我們已經學習了 r 語言的基礎功能,並且了解了如何運用向量 矩 陣 列表和資料框表示不同形式的資料,以及用內建函式解決簡單的問題。但是僅僅了解 這些功能並不能解決所有問題。現實中的資料分析通常需要對資料進行仔細的轉換和聚合,而這些操作則需要各種各樣內建的或是由擴充套件包提供的函式。為...

內部特殊引用 this

訪問物件中的成員,是通過 物件 成員 的方式訪問的,這是在物件的外部去訪問物件中成員的形式,那麼如果我想在物件的內部,讓物件裡的方法訪問本物件的屬性,或是物件中的方法去呼叫本物件的其它方法這時我們怎麼辦?因為物件裡面的所有的成員都要用物件來呼叫,包括物件的內部成員之間的呼叫,所以在php裡面給 我提...