今天要講的是C++中我最喜歡的一個用法——參考,也叫別名,
參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數,我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域,(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的,雖然參考是一個物件的別名,但是在匯編層面,和指標是一樣的,)
參考的定義
應用的定義和變數的定義差不多,主要的不同在于它指向的是一個變數,而不是和變數一樣指向的是某一個數值或其他型別的資料,
創建參考的格式如下:
資料型別 &參考名 = 原變數
比如:
int a = 1; int &b = a;
注意:由于參考并不需要申請一塊新的記憶體空間,因此在建立參考時只能宣告,不能定義,
面試題中常考這個知識點,請問下面的代碼是否正確:
int a = 1; int& b; b = a;
當然,它是錯的,第二行錯誤,參考在宣告的時候必須指定一個已有的變數,否則編譯器不知道給它分配哪一塊記憶體空間,
參考的特性
前面已經提到了,參考唯一的特性就是使用已有的記憶體空間,我們用一段小程式來驗證這個特性,
大家可以自己運行一下這段代碼,整個程序中,無論a發生變化還是b發生變化,a和b的值始終保持一致,
在使用參考時,我們需要注意下面的問題:
(1)參考必須與已有的變數相聯系
(2)參考并不獨立分配記憶體空間
(3)&前有資料型別,是參考符號;&前沒有資料型別,是取地址符號
比如:int& b = a;和int* p = &a;,前者是參考符號,后者是取地址符號,
(4)可以用參考給另一個參考初始化
int a =100; int& b =a; int& c = b;
這段代碼中,b和c都是a的參考,
(5)參考宣告后不能改變參考關系
int a,b; int&c = a; c = b;
這段代碼中,第三行想讓c成為b的參考是辦不到的,它實際實作的功能是把b的值傳遞給了a,c依然是a的參考,因為c一旦宣告為變數a的參考,就不能再修改成變數b的參考了,
參考做函式引數
這是參考最方便的地方,在學習C語言時,我們知道如果要寫一個變數值交換的函式需要使用指標,代碼如下:
這段代碼的執行結果如下:
a=1,b=2
a=2,b=1
我們通過swap函式成功交換了變數a和變數b的值,注意swap(&a, &b);這句話中的&符號是取地址符號,
很多同學不喜歡指標,見到*就恐懼,從今天起,我們可以用參考替代指標的使用,代碼如下:
這段代碼的執行結果如下:
a=1,b=2
a=2,b=1
結果完全相同,我們對swap函式做了修改,通過參考來得到形參的記憶體空間,之后通過參考完成這兩塊記憶體空間值的交換,
需要注意的是,在呼叫的時候swap(a, b);只需要進行值傳遞即可,
參考傳參的好處:與值傳遞相比,參考傳遞不用申請新的記憶體空間,特別是在需要傳遞類的物件時,能夠大大降低傳參帶來的開銷,
參考的常見錯誤
參考型別不匹配
int a=100; void& b= a; float& c = a;
第二行和第三行代碼都會報錯,參考的資料型別必須和原始變數型別相同,而且根本不存在void型別的參考,
不能建立參考陣列
int array[5]={0}; int& arr[5]= array;
這種寫法不允許,
對于單個變數的地址傳遞問題,參考可以完美地取代指標,這使我們在設計函式引數時更加方便,如果需要限定引數不被修改,可以結合const關鍵字使用,
End
自學C/C++編程難度很大,如果你想更快提升自己的編程能力和撰寫專案的水平,歡迎一起共同成長!
C語言C++編程學習交流圈子,QQ群【757874045點擊進入】微信公眾號:C語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/255.html
標籤:C++