歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++中的引用和指針

C++中的引用和指針

日期:2017/3/1 10:38:04   编辑:Linux編程

先看下面一段關於引用的說明:

引用是C++比C擴充的一種派生數據類型。引用是為對象取一個別名,不占存儲空間。
引用類型說明符為&
例:
int someInt;
int& rInt = someInt;
注意,在這裡引用類型變量rInt是someInt的一個別名,也就是這兩個表示的是同一個變量。它們指向的是同一個內存空間。
聲明一個引用變量時,必須同時使之初始化,即聲明它代表哪一個變量。並且從此不可改變。
一旦一個引用被初始化後,就不能改為指向其他對象。
引用類型的引入最大的好處,可以用來作形參:
如:void swap(int& a, int& b) { …… };

----------------------------------------
可以看到,引用的說明符“&”與取地址符是同一個符號,雖然他們是同一個符號,但是不要混。看下面:

int i = 3; //聲明int類型的變量i, 並初始為3
int &rI = i; //這裡的“&”是在左邊,把它認為只是一個符號,或者只是一個標識,表示變量rI是一個引用類型而以
int *pI = &i; //這裡的“&”是在右邊,表示取地址操作,它是一個操作符;
//經過“&”操作後的變量是一個指針,所以左邊必須聲明為一個指針類型。

從上面的這三行代碼可以看出,引用說明符“&”只是一個符號,不要與取地址符混淆就行了。
這個與“*”類似,“*”放在左邊也只是一個符號,說明是一個指針類型的變量;放在右邊做為操作符,則表示對指針變量進行解指針操作。
引用表示這個變量是原來的變量的一個別名,它們指向的是同一個內存空間。所以引用的對象的類型,原來是什麼類型,那麼該引用所代表的就是什麼類型。
而取地址符“&”,操作後的類型是一個指針類型的變量。與引用是不一樣的。

----------------------------------------
再看一個小例子,結合輸出結果體會一下:

void testRf()
{
int i = 30, j = 40;
int &rI = i;
int *pI = &i;
int *pRI = &rI;

cout << "i, j的值(i, j): (" << i << ", " << j << ") 地址: (&i, &j): (" << &i << ", " << &j << ")" << endl;
cout << "rI: " << rI << " pI:" << pI << " pRI:" << pRI << endl;

rI = j;
int *pRI2 = &rI;

cout << "嘗試改變rI的引用, rI: " << rI << endl;
cout << "此時i, j的值(i, j) : (" << i << ", " << j << ") 地址: (&i, &j): (" << &i << ", " << &j << ")" << endl;
cout << "pRI2: " << pRI2 << endl;

cout << "rI = " << rI << " *pI = " << *pI << endl;
}

輸出結果:
i, j的值 (i, j): (30, 40) 地址: (&i, &j): (0013FE8C, 0013FE80)
rI: 30 pI:0013FE8C pRI:0013FE8C
嘗試改變rI的引用, rI: 40
此時i, j的值 (i, j) : (40, 40) 地址: (&i, &j): (0013FE8C, 0013FE80)
pRI2: 0013FE8C
rI = 40 *pI = 40

從上面的輸出可以看出:
引用類型rI,與原來的類型i是一致的,都是int型,且指向同一塊內存地址。可以認為rI是i的別名,兩個是同一個變量;
引用類型初始化之後,便不可改變。這裡的不可改變可以理解為引用類型所指向的地址不變。上例中,當嘗試 rI=j 進行賦值,結果是將內存中原來 rI 對應的值給覆蓋了。因此,i的值也變成了4;

Copyright © Linux教程網 All Rights Reserved