對於乙個型別t,t* 就是指向t的指標型別,也即乙個t* 型別的變數能夠儲存乙個t物件的位址,而型別t是可以加一些限定詞的,如const、volatile等等。
引用是乙個物件的別名,主要用於函式引數和返回值型別。
1.引用在定義的時候必須進行初始化,因為我必須要知道引用的是誰,而指標沒有要求,宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。
2.沒有null引用,但是有null指標
3.引用在初始化時引用乙個實體後,就不能再引用其他實體,對乙個物件"至死不渝"(例如ra是a的別名的話,ra就不可以是b的別名),而指標可以在任何時候指向任何乙個同型別實體。
4.在sizeof中含義不同:引用結果為引用型別的大小,但sizeof乙個指標始終是位址空間所佔位元組個數(32位平台下佔4個位元組,62位平台下佔8個位元組)
5.引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小,指向下乙個物件
6.有多級指標,但是沒有多級引用
7.訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
8.引用比指標使用起來相對更安全
總而言之,它們的這些差別都可以歸結為"指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名,引用不改變指向。"
const對指標和引用的限定是有差別的
1.常量指標and常量引用
常量指標:const放在*的左邊
(例如:const int *p=&a 和 int const *p=&a)
修飾的是指標指向的內容
指標指向的內容不能通過指標來改變(*p不能改)
指標變數本身可以修改(p能改)
常量引用:const放在&的左邊
(例如:const int &ra=&a 和 int const &ra=&a)
跟指標一樣不能利用引用對指向的變數進行重新賦值操作。
2.指標常量and引用常量
指標常量:const放在*的右邊
(例如:int *const p=&a)
修飾的是指標變數本身
指標變數本身不可以修改(p不能改)
指標指向的內容可以通過指標來改變(*p可以改)
在定義指標常量時必須初始化!
引用常量:而這是引用天生具來的屬性,不用再引用指標定義語句的引用名前加const。引用時必須要進行初始化。
3.常量指標常量and常量引用常量
常量指標常量:
(例如:const int *const p=&a)
指標變數本身不可以修改(p不能改)
指標指向的內容也不可以通過指標來改變(*p也不可以改)
常量引用常量:
就不存在所謂的"常量引用常量"。
C 引用和指標區別
一 引用簡介 引用就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 例1 int a int ra a 定義引用ra,它是變數a的引用,即別名 說明 1 在此不是求位址運算,而是起標識作用。2 型別識別符號是指目標變數的型別。3 ...
C 引用和指標的區別
很久沒寫過這類文章了,本來是想做下筆記,既然要做筆記,不如寫下部落格,就動起手來。文采不怎麼樣,還忘大家見諒 c 引用變數是c 中新增的一種復合型別,也就是說標準c語言中沒有引用變數。所謂引用,實際上就是乙個已定義變數的別名,別名我想大家小時候都有,應該可以理解,別名表示的是同乙個人,這裡引用變數和...
C 引用和指標的區別
c 引用和指標在間接使用其他物件的各種操作功能上面類似,但是兩者的不同之處也很明顯 1.指標本身佔據記憶體空間,但是引用只是乙個物件的別名,本身不分配記憶體空間 2.指標定義時可以不初始化,但是定義乙個引用必須進行初始化,並且初始化時只能是乙個物件 比如 int b 3.14 這樣是錯的,要明白 引...