引用 與 指針

引用是C++中的概念,初學者容易把引用和指針混淆一起。  
一下程序中,n是m的一個引用(reference),m是被引用物(referent)。  
int m;  
int &n = m;  
n相當於m的別名(綽號),對n的任何操作就是對m的操作。  
所以n既不是m的拷貝,也不是指向m的指針,其實n就是m它自己。  

引用的規則:  

(1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。  
(2)不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。  
(3)一旦引用被初始化,就不能改變引用的關係(指針則可以隨時改變所指的對象)。  

以下示例程序中,k被初始化爲i的引用。  
語句k = j並不能將k修改成爲j的引用,只是把k的值改變成爲6。  
由於k是i的引用,所以i的值也變成了6。  
int i = 5;  
int j = 6;  
int &k = i;  
k = j; // k和i的值都變成了6;  

引用的主要功能是傳遞函數的參數和返回值。  

C++語言中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。  

以下是"值傳遞"的示例程序。  

由於Func1函數體內的x是外部變量n的一份拷貝,改變x的值不會影響n, 所以n的值仍然是0。  
void Func1(int x)  
{  
x = x + 10;  
}  
...  
int n = 0;  
Func1(n);  
cout << "n = " << n << endl; // n = 0  

以下是"指針傳遞"的示例程序。  

由於Func2函數體內的x是指向外部變量n的指針,改變該指針的內容將導致n的值改變,所以n的值成爲10。  
void Func2(int *x)  
{  
(* x) = (* x) + 10;  
}  
...  
int n = 0;  
Func2(&n);  
cout << "n = " << n << endl; // n = 10  

以下是"引用傳遞"的示例程序。  

由於Func3函數體內的x是外部變量n的引用,x和n是同一個東西,改變x等於改變n,所以n的值成爲10。  
void Func3(int &x)  
{  
x = x + 10;  
}  
...  
int n = 0;  
Func3(n);  
cout << "n = " << n << endl; // n = 10  

對比上述三個示例程序,會發現"引用傳遞"的性質象"指針傳遞",而書寫方式象"值傳遞"。  

實際上"引用"可以做的任何事情"指針"也都能夠做,爲什麼還要"引用"這東西?  
答案是"用適當的工具做恰如其分的工作"。  

指針能夠毫無約束地操作內存中的任何東西,儘管指針功能強大,但是非常危險。  

如果的確只需要借用一下某個對象的"別名",那麼就用"引用",而不要用"指針",以免發生意外。

  

引用就是傳遞的原始變量,指針傳遞的是變量的地址,兩者沒什麼關係,

引用主要用於函數參數的傳遞,相對於傳值,可以節省內存空間,  
指針可以直接傳遞變量地址,也可以可以節省內存空間,但是指針功能強大一些,可以在自由操作數組變量。

二、比較二

(1)非空區別。在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量並讓他指向一個對象,但是該變量在某些時候也可能不指向任何對象,這是你應該把變量聲明爲指針,因爲這樣你可以賦予空值給該變量。相反,如果變量肯定指向一個對象,例如你的設計不允許變量爲空,這時你就可以把變量聲明爲引用。不存在指向空值得引用這個事實意味着使用引用的代碼效率比使用指針要高。

(2)合法性區別。在使用引用之前不需要測試它的合法性。相反,指針則應該總是被測試,防止其爲空。

(3)可修改區別。指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則是總是指向在初始化時被指定的對象,以後不能改變,但是指定的對象其內容可以改變。

(4)應用區別。總的來說,在以下情況下你應該使用指針:一是你考慮到存在不指向任何對象對象的可能(在這種情況下,你能夠設置指針爲空),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼你應該使用引用。   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章