c 中引用變數的注意事項,和指標的區別

2021-06-23 04:23:36 字數 3027 閱讀 1807

1. 定義引用時必須初始化(變數或者常量),且初始化後不能再指向其他變數或者常量。指標卻可以在定義時不初始化,可以在定義後的任何地方初始化,或者改變指向的物件。

2. 存在指標的引用,但是沒有引用的指標,因為引用在概念上只是乙個代號,沒有實體空間。

3. 不能定義引用陣列,即便用類似「 int &b[5] = ;」初始化也不可以。卻可以有陣列的引用,陣列的引用用在函式的引數傳遞上,這樣可以讓編譯器檢查實參的陣列大小和形參的陣列大小是否匹配。

在《c++ primer 第四版》的第七章中,講到了通過引用傳遞陣列,和其他型別一樣,陣列形參可宣告為陣列的引用。如果形參是陣列的引用,編譯器不會將陣列實參轉化為指標,而是傳遞陣列的引用本身。在這種情況下,陣列大小成為形參與實參型別的一部分,編譯器檢查陣列實參的大小與形參的大小是否匹配。

[cpp]view plain

copy

print?

#include 

using

namespace std;  

void output(int (&a)[5])  

int main()  

;  output(a);  

getchar();  

return 0;  

}   

#include using namespace std;

void output(int (&a)[5])

;  int (&b)[5] = a;  

for(int i = 0; i 

cout

getchar();  

return 0;  

}   

#include using namespace std;

int main()

; int (&b)[5] = a;

for(int i = 0; i < 5; i++)

cout輸出結果為:

從執行結果中可以看到b的大小和陣列a的大小一樣,也為20。

可見陣列的引用同樣可以看做是陣列的乙個別名。

但如果將上面**中的 int (&b)[5] = a; 改為 int &b[5] = a;則編譯無法通過,因為宣告了乙個引用陣列。即便你將引用陣列b中的每乙個元素b[i]看做對a[i]的引用,然後對每乙個元素進行初始化,也是錯誤的:

int &b[5] = ;

一句話,你可以建立對陣列的引用,但你不能建立乙個元素都是引用的陣列。

附:引用占用記憶體空間嗎?摘自

引用是在彙編**中是如何實現的,這要看編譯器的實現,不過大數多編譯器用指標來實現。但並不**會為它分配空間。

以下面程式為例:

[cpp]view plain

copy

print?

int ia =1;  

int &ib = ia ;  

int ic = 2 ;  

printf("%p\n",&ia) ;  

printf("%p\n",&ib) ;  

printf("%p\n",&ic) ;   

int ia =1;

int &ib = ia ;

int ic = 2 ;

printf("%p\n",&ia) ;

printf("%p\n",&ib) ;

printf("%p\n",&ic) ;

經編譯器後,可以轉換成如下的**:

[cpp]view plain

copy

print?

int ia =1;  

int *ib = &ia ;    //ib由引用變成指標

int ic = 2 ;  

printf("%p\n",&ia) ;  

printf("%p\n",ib) ;  //引用取位址=>指標本身就是位址

printf("%p\n",&ic) ;   

int ia =1;

int *ib = &ia ; //ib由引用變成指標

int ic = 2 ;

printf("%p\n",&ia) ;

printf("%p\n",ib) ; //引用取位址=>指標本身就是位址

printf("%p\n",&ic) ;

這裡為ib分配了乙個空間,但由ib這個指標很特殊,在定義的時候一定要有初始化,這就為它的優化提供了很好的依據。

上面的**完全可以變成下面這樣:

[cpp]view plain

copy

print?

int ia =1;  

//int &ib = ia ; 編譯只需記住ib是ia的引用,不需要分配空間

int ic = 2 ;  

printf("%p\n",&ia) ;  

printf("%p\n",&ia) ; //原來是printf("%p\n",&ib) ;ib即ia(引用定義),故直接用ia來替換

printf("%p\n",&ic) ;   

int ia =1;

//int &ib = ia ; 編譯只需記住ib是ia的引用,不需要分配空間

int ic = 2 ;

printf("%p\n",&ia) ;

printf("%p\n",&ia) ; //原來是printf("%p\n",&ib) ;ib即ia(引用定義),故直接用ia來替換

printf("%p\n",&ic) ;

最後這個**就沒有為引用分配空間…… 如果標準沒有規定這些行為,不同的編譯器會有不同的行為。

4. 引用總是const,在定義引用的時候如果加上const,說明該變數引用的物件是const。

5. 不能引用null。

C 隨筆(指標和引用的使用注意事項)

1 不要用函式的行參,行參是用來向函式裡 傳遞引數的。如class obj obj obj const obj obj class objs objs obj m obj obj void getobj obj m obj obj getobj void getobj obj obj ptr voi...

C 學習筆記 指標和引用的注意事項

一 指標 1指標變數的定義,由資料型別後跟星號,再跟指標變數名組成。2 表示乙個實體的位址,此符號可用來對指標變數初始化和賦值 如 int count 18 int iptr count int ip ip count 3 除了可以用來定義指標,標緻乘法運算子,還可以做間訪操作 間訪操作就是 取指標...

C 中的this指標的注意事項

this是c 中的乙個關鍵字,實質是乙個const指標,指向當前物件,通過它可以訪問當前物件的所有成員。所謂當前物件就是正在使用的物件。例如 p1.speak p1 就是當前使用的物件,this就是指向p1。注意 友元函式沒有this指標,因為友元函式不是類中的成員函式,只有成員函式才有this指標...