指標和引用的區別與相同點
原文地址:http://blog.csdn.net/will130/article/details/48730725
一、指標和引用的定義和性質區別:
(1) 指標:指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元,即指標是一個實體;而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
- 1
- 2
- 3
- 1
- 2
- 3
上面定義了一個整形變數和一個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的地址。
而下面2句定義了一個整形變數a和這個整形a的引用b,事實上a和b是同一個東西,在記憶體佔有同一個儲存單元。
(2) 可以有const指標,但是沒有const引用;
(3) 指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
(4) 指標的值可以為空,但是引用的值不能為NULL,並且引用在定義的時候必須初始化;
(5) 指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了,從一而終。
(6)”sizeof引用”得到的是所指向的變數(物件)的大小,而”sizeof指標”得到的是指標本身的大小;
(7)指標和引用的自增(++)運算意義不一樣;
二、相同點
都是地址的概念;
指標指向一塊記憶體,它的內容是所指記憶體的地址;
引用是某塊記憶體的別名。
三、聯絡
1、引用在語言內部用指標實現(如何實現?)。
2、對一般應用而言,把引用理解為指標,不會犯嚴重語義錯誤。引用是操作受限了的指標(僅容許取內容操作)。
引用是C++中的概念,初學者容易把引用和指標混淆一起。以下程式中,n是m的一個引用(reference),m 是被引用物(referent)。
int m;
int &n = m;
- 1
- 2
- 1
- 2
n 相當於m 的別名(綽號),對n 的任何操作就是對m 的操作。
引用的一些規則如下:
(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。
(2)不能有NULL 引用,引用必須與合法的儲存單元關聯(指標則可以是NULL )。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。
- 1
- 2
- 3
- 1
- 2
- 3
以下示例程式中,k 被初始化為i 的引用。語句k = j 是把k 的值改變成為6,由於k 是i 的引用,所以i 的值也變成了6.
int i = 5;
int j = 6;
int &k = i;
k = j; // k 和i 的值都變成了6
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
上面的程式看起來象在玩文字遊戲,沒有體現出引用的價值。引用的主要功能是傳遞函式的引數和返回值。C++語言中,函式的引數和返回值的傳遞方式有三種:值傳遞、指標傳遞和引用傳遞。
“引用傳遞”的性質像“指標傳遞”,而書寫方式像“值傳遞”。實際上“引用”可以做的任何事情“指標”也都能夠做,為什麼還要“引用”這東西?
答案是“用適當的工具做恰如其分的工作”。
指標能夠毫無約束地操作記憶體中的如何東西,儘管指標功能強大,但是非常危險。
就象一把刀,它可以用來砍樹、裁紙、修指甲、理髮等等,誰敢這樣用?
如果的確只需要借用一下某個物件的“別名”,那麼就用“引用”,而不要用“指標”,以免發生意外。比如說,某人需要一份證明,本來在檔案上蓋上公章的印子就行了,如果把取公章的鑰匙交給他,那麼他就獲得了不該有的權利。
總的來說,在以下情況下你應該使用指標:
一是你考慮到存在不指向任何物件的可能(在這種情況下,你能夠設定指標為空),
二是你需要能夠在不同的時刻指向不同的物件(在這種情況下,你能改變指標的指向)。如果總是指向一個物件並且一旦指向一個物件後就不會改變指向,那麼你應該使用引用。
還有一種情況,就是當你過載某個操作符時,你應該使用引用。
儘可能使用引用,不得已時使用指標。
當你不需要“重新指向”時,引用一般優先於指標被選用。這通常意味著引用用於類的公有介面時更有用。引用出現的典型場合是物件的表面,而指標用於物件內部。