1. 程式人生 > >指標和引用的區別與相同點

指標和引用的區別與相同點

原文地址: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++語言中,函式的引數和返回值的傳遞方式有三種:值傳遞、指標傳遞和引用傳遞。

“引用傳遞”的性質像“指標傳遞”,而書寫方式像“值傳遞”。實際上“引用”可以做的任何事情“指標”也都能夠做,為什麼還要“引用”這東西

答案是“用適當的工具做恰如其分的工作”。

指標能夠毫無約束地操作記憶體中的如何東西,儘管指標功能強大,但是非常危險

就象一把刀,它可以用來砍樹、裁紙、修指甲、理髮等等,誰敢這樣用?

如果的確只需要借用一下某個物件的“別名”,那麼就用“引用”,而不要用“指標”,以免發生意外。比如說,某人需要一份證明,本來在檔案上蓋上公章的印子就行了,如果把取公章的鑰匙交給他,那麼他就獲得了不該有的權利。

總的來說,在以下情況下你應該使用指標:

一是你考慮到存在不指向任何物件的可能(在這種情況下,你能夠設定指標為空),

二是你需要能夠在不同的時刻指向不同的物件(在這種情況下,你能改變指標的指向)。如果總是指向一個物件並且一旦指向一個物件後就不會改變指向,那麼你應該使用引用。

還有一種情況,就是當你過載某個操作符時,你應該使用引用。

儘可能使用引用,不得已時使用指標。

當你不需要“重新指向”時,引用一般優先於指標被選用。這通常意味著引用用於類的公有介面時更有用。引用出現的典型場合是物件的表面,而指標用於物件內部。