在深入介紹之前我們首先來看一下指標和引用的定義、指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。
指標和引用的定義,
下面用通俗易懂的話來概述一下:
而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。
其次,引用不可以改變指向,對乙個物件"至死不渝";但是指標可以改變指向,而指向其它物件。說明:雖然引用不可以改變指向,但是可以改變初始化物件的內容。例如就++操作而言,對引用的操作直接反應到所指向的物件,而不是改變指向;而對指標的操作,會使指標指向下乙個物件,而不是改變所指物件的內容。見下面的**:
#includeusing namespace std;
int main(int argc,char** argv)
{ int i=10;
int& ref=i;
ref++;
cout<
對ref的++操作是直接反應到所指變數之上,對引用變數ref重新賦值"ref=j",並不會改變ref的指向,它仍然指向的是i,而不是j。理所當然,這時對ref進行++操作不會影響到j。而這些換做是指標的話,情況大不相同,請自行實驗。輸出結果如下:
再次,引用的大小是所指向的變數的大小,因為引用只是乙個別名而已;指標是指標本身的大小,4個位元組。見下圖所示:
從上面也可以看出:引用比指標使用起來形式上更漂亮,使用引用指向的內容時可以之間用引用變數名,而不像指標一樣要使用*;定義引用的時候也不用像指標一樣使用&取址。
最後,引用比指標更安全。由於不存在空引用,並且引用一旦被初始化為指向乙個物件,它就不能被改變為另乙個物件的引用,因此引用很安全。對於指標來說,它可以隨時指向別的物件,並且可以不被初始化,或為null,所以不安全。const 指標雖然不能改變指向,但仍然存在空指標,並且有可能產生野指標(即多個指標指向一塊記憶體,free掉乙個指標之後,別的指標就成了野指標)。
總而言之,言而總之——它們的這些差別都可以歸結為"指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名,引用不改變指向。"
在這裡我為什麼要提到const關鍵字呢?因為const對指標和引用的限定是有差別的,下面聽我一一到來。
常量指標:指向常量的指標,在指標定義語句的型別前加const,表示指向的物件是常量。
定義指向常量的指標只限制指標的間接訪問操作,而不能規定指標指向的值本身的操作規定性。
常量指標定義"const int* pointer=&a"告訴編譯器,*pointer是常量,不能將*pointer作為左值進行操作。
常量引用:指向常量的引用,在引用定義語句的型別前加const,表示指向的物件是常量。也跟指標一樣不能利用引用對指向的變數進行重新賦值操作。
在指標定義語句的指標名前加const,表示指標本身是常量。在定義指標常量時必須初始化!而這是引用天生具來的屬性,不用再引用指標定義語句的引用名前加const。
指標常量定義"int* const pointer=&b"告訴編譯器,pointer是常量,不能作為左值進行操作,但是允許修改間接訪問值,即*pointer可以修改。
常量指標常量:指向常量的指標常量,可以定義乙個指向常量的指標常量,它必須在定義時初始化。常量指標常量定義"const int* const pointer=&c"告訴編譯器,pointer和*pointer都是常量,他們都不能作為左值進行操作。
而就不存在所謂的"常量引用常量",因為跟上面講的一樣引用變數就是引用常量。c++不區分變數的const引用和const變數的引用。程式決不能給引用本身重新賦值,使他指向另乙個變數,因此引用總是const的。如果對引用應用關鍵字const,起作用就是使其目標稱為const變數。即沒有:const double const& a=1;只有const double& a=1;
C 引用和指標
引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...
C 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...
c 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。到目前為止我們介紹過函式引數傳遞的兩種情況。1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實...