引用和指針的其他區別
1) 引用必須在定義時初始化,並且以後也要從一而終,不能再指向其他數據;而指針沒有這個限制,指針在定義時不必賦值,以後也能指向任意數據。
2) 可以有 const 指針,但是沒有 const 引用。也就是說,引用變量不能定義爲下面的形式:
- int a = 20;
- int & const r = a;
因爲 r 本來就不能改變指向,加上 const 是多此一舉。
其實引用只是對指針進行了簡單的封裝,它的底層依然是通過指針實現的,引用佔用的內存和指針佔用的內存長度一樣,在 32 位環境下是 4 個字節,在 64 位環境下是 8 個字節,之所以不能獲取引用的地址,是因爲編譯器進行了內部轉換。以下面的語句爲例:
int a = 99;
int &r = a;
r = 18;
cout<<&r<<endl;
編譯時會被轉換成如下的形式:
int a = 99;
int *r = &a;
*r = 18;
cout<<r<<endl;
使用&r取地址時,編譯器會對代碼進行隱式的轉換,使得代碼輸出的是 r 的內容(a 的地址),而不是 r 的地址,這就是爲什麼獲取不到引用變量的地址的原因。也就是說,不是變量 r 不佔用內存,而是編譯器不讓獲取它的地址。
當引用作爲函數參數時,也會有類似的轉換。以下面的代碼爲例:
純文本複製
//定義函數
void swap(int &r1, int &r2){
int temp = r1;
r1 = r2;
r2 = temp;
}
/調用函數
int num1 = 10, num2 = 20;
swap(num1, num2);
編譯時會被轉換成如下的形式:
//定義函數
void swap(int *r1, int *r2){
int temp = *r1;
*r1 = *r2;
*r2 = temp;
}
//調用函數
int num1 = 10, num2 = 20;
swap(&num1, &num2);
引用雖然是基於指針實現的,但它比指針更加易用,從上面的兩個例子也可以看出來,通過指針獲取數據時需要加*,書寫麻煩,而引用不需要,它和普通變量的使用方式一樣。
C++ 的發明人 Bjarne Stroustrup 也說過,他在 C++ 中引入引用的直接目的是爲了讓代碼的書寫更加漂亮,尤其是在運算符重載中,不借助引用有時候會使得運算符的使用很麻煩。