C 引用和指標區別

2021-07-26 20:17:30 字數 2541 閱讀 8519

一、引用簡介

引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。

引用的宣告方法:型別識別符號 &引用名=目標變數名;

【例1】:int a; int &ra=a; //定義引用ra,它是變數a的引用,即別名

說明:(1)&在此不是求位址運算,而是起標識作用。

(2)型別識別符號是指目標變數的型別。

(3)乙個變數可以有多個引用

(3)宣告引用時,必須同時對其進行初始化。

(4)引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。

ra=1; 等價於 a=1;

(5)宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra與&a相等。

(6)不能建立引用的引用。

如:  int a=3;

int&b=a;//正確,b是a的別名

int&c=b;//錯誤,不能建立引用的引用

int *p=b;//錯誤,也不能建立指向引用的指標

int *p1=b;//把變數a的位址&a賦給指標變數p1

(7)不能建立陣列的引用是說,陣列的元素不能是引用。

而int(&b)[3] = a;

b本身是乙個引用,b不是陣列。

b的引用是陣列名a.

但是:inta[5],  int &b[3] = a;//錯誤,不能建立陣列引用

int&b=a[0];//錯誤,不能作為陣列元素的別名

二、引用應用

1、引用作為引數

引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(c++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。

【例2】

void swap(int &p1, int &p2) //此處函式的形參p1, p2都是引用

為在程式中呼叫該函式,則相應的主調函式的呼叫點處,直接以變數作為實參進行呼叫即可,而不需要實參變數有任何的特殊要求。如:對應上面定義的swap函式,相應的主調函式可寫為:

main( )

int a,b;

cin>>a>>b; //輸入a,b兩變數的值

swap(a,b); //直接以變數a和b作為實參呼叫swap函式

cout《上述程式執行時,如果輸入資料10 20並回車後,則輸出結果為20 10。

由【例2】可看出:

(1)傳遞引用給函式與傳遞指標的效果是一樣的。這時,被調函式的形參就成為原來主調函式中的實參變數或物件的乙個別名來使用,所以在被調函式中對形參變數的操作就是對其相應的目標物件(在主調函式中)的操作。

(2)使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式。因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好。

(3)使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用"*指標變數名"的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的位址作為實參。而引用更容易使用,更清晰。

如果既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。

2、常引用

常引用宣告方式:const 型別識別符號 &引用名=目標變數名;

用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性。

【例3】:

int a ;

const int &ra=a;

ra=1; //錯誤

a=1; //正確

不光是讓**更健壯,也有些其它方面的需要。

【例4】:假設有如下函式宣告:

string foo( );

void bar(string & s);

那麼下面的表示式將是非法的:

bar(foo( ));

bar("hello world");

原因在於foo( )和"hello world"串都會產生乙個臨時物件,而在c++中,這些臨時物件都是const型別的。因此上面的表示式就是試圖將乙個const型別的物件轉換為非const型別,這是非法的。

引用型引數應該在能被定義為const的情況下,盡量定義為const 。

總結引用和指標的區別:

1、  引用在定義時必須初始化,指標沒有要求(最好初始化)。

2、  一旦乙個引用被初始化為指向乙個物件,就不能再指向其他物件,而指標可以在任何時候指向任何乙個同型別物件。

3、  沒有null引用,但有null指標。

5、  引用自加改變變數的內容,指標自加改變了指標指向。

6、  有多級引用,但是沒有多級指標。

7、  引用比指標使用起來更相對安全。

C 引用和指標的區別

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

C 引用和指標的區別

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

C 指標和引用的區別

一 前言 作為一名c 程式設計師,關於指標和引用必須要有足夠的認識。最近在閱讀 大全2 感覺學習了很多,其中第13章,談論了這個部分。二 指標和引用的區別 在c 中,指標 和引用 都能夠間接地引用物件。對新手來說,看起來只是obj field 和 obj.field 的區別。他們的區別在於 1.引用...