C 中引用和指標的不同

2021-06-04 21:46:53 字數 1446 閱讀 8495

分類: c++

2009-03-01 14:19

281人閱讀收藏

舉報 引用,其本質就是指標,將它用在一些特別的場合,會比指標更簡潔,更方便。具體說來,指標多用於動態記憶體管理和對陣列的操作等,c風格的**接收和返回指標;引用則往往用在接收和返回類型別的名字空間域函式或類域函式,以避免類物件的複製開銷。但是請注意,引用畢竟不完全等同於指標,它們有一些差異:

1、引用必須初始化,指標則不然。

int *pi;//可以

int &ri;//不行,未初始化

int i;int &ri=i;//可以

2、引用不能為空引用,指標則不然。

int *pi=null;//可以

int *pi=null;int &ri=*pi;//會引發問題。

3、引用在初始化後,不能再引用其他物件,指標則不然。

void f(int &ri)

雖然每次呼叫f時,都有可能會使形參ri,引用不同的實參,但是在f函式內,無法在呼叫處,引用初始化後,再改變其所引用的物件。顯然包括引用在內,在很多時候,初始化與賦值運算子的語義有很大區別。

4、引用在必要時實現為指標,但是常規語法取不到這個內部指標的位址。

int i=3;int *pi=&i;//i的值為3,位址為&i;pi的值為&i,位址為&pi

int i=3;int &ri=i;//i的值為3,位址為&i;ri的值為3,位址為&i,初始化後ri和i基本為同義語。

實際上,當引用ri初始化為i後,語言實現可能只將ri優化處理成i的別名,而不將其實現為指標;也可能使用乙個內部指標來完成工作。比如第3條中的f函式的形參ri,每次具體呼叫函式時,都可能會傳入不同位址的實參。因為設計引用就是要避免物件複製的,因此它會壓入堆疊乙個指向被引用型別的指標。有可能這樣來實現:

int i=3;

int &ri=i;//可實現為int *temp_pi=&i;以後每次源程式中使用ri時,就會被相應替換成*temp_pi

即使實現為這樣的內部指標,也無法用正常的語法來取得它的位址。因為按照上邊的分析,初始化後,取位址操作&ri將等價於&*temp_pi。那麼這對使用者來說,有什麼會造成影響的不同嗎?來看看一種不太常見的情況:可變個數參數列的省略號...前乙個引數,如果是引用型別,將無法正常工作;如果是指標型別或簡單型別等,則不會有問題。如有以下宣告:

void f(int i,...);

則在實現**中,可以使用c標準庫的stdarg.h來取得可變個數部分的引數。有興趣的話可以去看看stdarg.h的具體**,它是用巨集來完成的,針對不同的環境,採用了相應的手段。我用一段功能類似的偽**來說明一下:

void f(int i,...)//此函式用i來表示可變個數引數的個數

{int ix;

void *base=&i;

for(ix=0;ix

C 中引用和指標的不同

引用,其本質就是指標,將它用在一些特別的場合,會比指標更簡潔,更方便。具體說來,指標多用於動態記憶體管理和對陣列的操作等,c風格的 接收和返回指標 引用則往往用在接收和返回類型別的名字空間域函式或類域函式,以避免類物件的複製開銷。但是請注意,引用畢竟不完全等同於指標,它們有一些差異 1 引用必須初始...

C 中引用與指標的相同和不同

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件 指標變數中的值可以改 而引用物件則不能修改。相同點 都是位址的概...

C 中的指標和引用

注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。本人在工作之餘學習c 但是可能在訓練過程種,會通過各種刷題的形式去提公升自己,但是這樣在一些公司 尤其是大廠 面試的時候會很尷尬。而c 種的指標和引用有什麼區別和聯絡呢,現在就來說道說道,如有錯誤,敬請大家指正。首先我們來說道說道指標...