C 中引用和指標的區別

2021-07-05 05:38:23 字數 2753 閱讀 3034

下面用通俗易懂的話來概述一下:

其次,引用不可以改變指向,對乙個物件」至死不渝」;但是指標可以改變指向,而指向其它物件。說明:雖然引用不可以改變指向,但是可以改變初始化物件的內容。例如就++操作而言,對引用的操作直接反應到所指向的物件,而不是改變指向;而對指標的操作,會使指標指向下乙個物件,而不是改變所指物件的內容。見下面的**:

#include

using

namespace

std;

int main(int argc,char** argv)

對ref的++操作是直接反應到所指變數之上,對引用變數ref重新賦值」ref=j」,並不會改變ref的指向,它仍然指向的是i,而不是j。理所當然,這時對ref進行++操作不會影響到j。而這些換做是指標的話,情況大不相同,請自行實驗。輸出結果如下:

再次,引用的大小是所指向的變數的大小,因為引用只是乙個別名而已;指標是指標本身的大小,4個位元組。(32位機子4,64位8)見下圖所示:

從上面也可以看出:引用比指標使用起來形式上更漂亮,使用引用指向的內容時可以之間用引用變數名,而不像指標一樣要使用;定義引用的時候也不用像指標一樣使用&取址。*

最後,引用比指標更安全。由於不存在空引用,並且引用一旦被初始化為指向乙個物件,它就不能被改變為另乙個物件的引用,因此引用很安全。對於指標來說,它可以隨時指向別的物件,並且可以不被初始化,或為null,所以不安全。const 指標雖然不能改變指向,但仍然存在空指標,並且有可能產生野指標(即多個指標指向一塊記憶體,free掉乙個指標之後,別的指標就成了野指標)。

總而言之,言而總之——它們的這些差別都可以歸結為」指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名,引用不改變指向。」

在這裡我為什麼要提到const關鍵字呢?因為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;

我們利用下面一段簡單的**來深入分析指標和引用:

#include

using

namespace

std;

int main(int argc, char** argv)

使用引用機制後,以上程式的c++版本為:

當大型物件被傳遞給函式時,使用引用引數可使引數傳遞效率得到提高,因為引用並不產生物件的副本,也就是引數傳遞時,物件無須複製。下面的例子定義了乙個有限整數集合的類:

const maxcard=100; 

class set

//建構函式

friend set operator * (set ,set ) ; //過載運算符號*,用於計算集合的交集 用物件作為傳值引數

// friend set operator * (set & ,set & ) 過載運算符號*,用於計算集合的交集 用物件的引用作為傳值引數

...}

先考慮集合交集的實現

set operator *( set set1,set set2)

return res;

}

由於過載運算子不能對指標單獨操作,我們必須把運算數宣告為 set 型別而不是 set * 。

每次使用*做交集運算時,整個集合都被複製,這樣效率很低。我們可以用引用來避免這種情況。

set operator *( set &set1,set &set2)

return res;

}

如果乙個函式返回了引用,那麼該函式的呼叫也可以被賦值。這裡有一函式,它擁有兩個引用引數並返回乙個雙精度數的引用:

double &max(double &d1,double &d2)

由於max()函式返回乙個對雙精度數的引用,那麼我們就可以用max() 來對其中較大的雙精度數加1:

max(x,y)+=1.0;

C 中引用和指標的區別

1 引用是直接引用,指標是間接引用 假如我們宣告並初始化變數a int a 1 那麼記憶體中就肯定有乙個地方的值變為了1,而且以名字a來引用。如果這時候我們在定義乙個引用int b a 那麼這塊記憶體區域就多了乙個名字b,我們引用名字b同樣是引用名字a。因為引用只是為某一記憶體空間取乙個別名,所以引...

c 中引用和指標的區別

c 中引用和指標的區別 1.引用沒有自身的記憶體空間,指標有 引用是已經存在的變數的別名,他所指向的記憶體即原來變數的記憶體。指標有自己的記憶體,在32位作業系統下,為4個位元組 也就是說,sizeof 引用 的值為引用所指變數記憶體空間大小,sizeof 指標 等於4 2.引用必須初始化,指標不用...

C 中引用和指標的區別

當引用被建立時,它必須被初始化。而指標則可以在任何時候被初始化 一旦乙個引用被初始化為指向乙個物件,他就不能被改變為對另乙個物件的引用,而指標則可以在任何時候指向另乙個物件 不可能有null的引用,必須確保引用是和一塊合法的儲存單元關聯 指標和引用都是c 中的基本語法成分,他們既有聯絡,又有不同之處...