C 指標和引用的區別

2021-08-07 04:31:59 字數 1476 閱讀 9612

指標是c系語言的一大特色,也在很大程度上體現著c/c++的精髓,乙個資料物件的記憶體位址稱為該資料物件的指標。本質上指標是乙個變數,所以它有自己的型別,這個型別決定了它可以指向何種型別的資料物件;之所以使用資料物件這個說法,是因為指標能夠代表的遠遠不止變數,還包括陣列,陣列元素,結構體,甚至函式。

引用是c++對c語言的乙個補充,它的作用是為乙個變數起乙個別名。

個人理解:很多時候下把「引用」當做乙個名詞來理解會更順暢一些,比如說定義乙個引用,某某的引用,當然這個是個人觀點,並沒有嚴格的論證。

那麼從指標與引用的區別的角度考慮二者的特性的話,有下面幾點:

(1)非空區別:

在任何情況下都不能使用指向空值的引用, 乙個引用必須總是指向某些物件。 換句話說乙個引用在宣告的時候就必須要初始化(除了作為函式的引數),而指標是沒有這個問題的,我們在定義乙個指標但是不讓它指向任何物件,是完全可以的:

//錯誤,需要初始值

int &b;

//正確

int *p;

因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向任何物件,這時你應該把變數宣告為指標,因為這樣你可以賦空值給該變數。 相反,如果變數肯定指向乙個物件,例如你的設計不允許變數為空,這時你就可以把變數宣告為引用。不存在指向空值的引用這個事實意味著使用引用的**效率比使用指標要高。

(2)合法性區別:

在使用引用之前不需要測試它的合法性。 相反,指標則應該總是被測試,防止其為空。這個問題和上面的其實是對應的,既然指標在定義的時候可以為空,但是乙個為空的指針對實現乙個功能是沒有用的,為了**的魯棒性,我們必須時刻考慮指標為空的情況,這在指標作為函式的引數時尤為常見。

(3)可修改區別:

指標與引用的另乙個重要的區別是指標可以被重新賦值以指向另乙個不同的物件。 但是引用則總是指向在初始化時被指定的物件,以後不能改變,但是指定的物件其內容可以改變。

由於引用的宣告和初始化總是在一起的,所以不可能讓乙個物件的引用指向另乙個,這完全沒有道理,假設a的引用是c,那麼在執行int &c=b;就重定義了,如果執行c = b;,那麼只是把b的值賦值給c,也就是a。

int a =1;

int b =2;

int &c=a;

int *p=&a;

cout

<(4)應用區別:

以上的特性決定了指標和引用的一些應用上的區別,總的來說,在以下情況下應該使用指標:一是考慮到存在不指向任何物件的可能(在這種情況下,能夠設定指標為空),二是需要能夠在不同的時刻指向不同的物件(在這種情況下,你能改變指標的指向)。 如果總是指向乙個物件並且一旦指向乙個物件後就不會改變指向,那麼應該使用引用。

(5)補充

不能建立陣列的引用,指標是可以代表陣列的,指向陣列的指標是陣列的首位址,但是引用是不可以的。

C 引用和指標區別

一 引用簡介 引用就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 例1 int a int ra a 定義引用ra,它是變數a的引用,即別名 說明 1 在此不是求位址運算,而是起標識作用。2 型別識別符號是指目標變數的型別。3 ...

C 引用和指標的區別

很久沒寫過這類文章了,本來是想做下筆記,既然要做筆記,不如寫下部落格,就動起手來。文采不怎麼樣,還忘大家見諒 c 引用變數是c 中新增的一種復合型別,也就是說標準c語言中沒有引用變數。所謂引用,實際上就是乙個已定義變數的別名,別名我想大家小時候都有,應該可以理解,別名表示的是同乙個人,這裡引用變數和...

C 引用和指標的區別

c 引用和指標在間接使用其他物件的各種操作功能上面類似,但是兩者的不同之處也很明顯 1.指標本身佔據記憶體空間,但是引用只是乙個物件的別名,本身不分配記憶體空間 2.指標定義時可以不初始化,但是定義乙個引用必須進行初始化,並且初始化時只能是乙個物件 比如 int b 3.14 這樣是錯的,要明白 引...