指針和引用有什么區(qū)別?分別什么時候引用?
掃描二維碼
隨時隨地手機看文章
先拋出兩個問題:
指針和引用有什么區(qū)別?
什么時候應該使用指針?什么時候應該使用引用?
首先看一段代碼:
int a = 1;
int b = 2;
int *c = nullptr;
c = &a;
int &d = b;
指針其實就是一個存放內存地址的整數(shù),這個整數(shù)表示的是被指向的變量的地址。
引用其實就是變量的別名,就是給變量重新起了一個名字,注意引用既然是個別名,那它一定要有本體,一個人叫王二小,我們也可以給它起個別名叫二蛋,我們提到二蛋和王二小其實都是同一個人。
區(qū)別:
指針在聲明時可以暫時不初始化,即pointer = nullptr,指針在生命周期內隨時都可能是空指針,所以在每次使用時都要做檢查,防止出現(xiàn)空指針異常問題,而引用卻不需要做檢查,因為引用永遠都不會為空,它一定有本體,一定得代表某個對象,引用在創(chuàng)建的同時必須被初始化。
void FuncPtr(int *ptr) {
if (ptr != nullptr) {
cout << *ptr;
}
}
void FuncReference(int &ref) {
cout << ref;
}
指針存放的是地址,指針可以被重新賦值,可以在初始化時指向一個對象,在其它時刻也可以指向另一個對象,而引用非常專一,它會從一而終,它總是指向它最初代表的那個對象。再舉個例子,有一個人叫特朗普,為他起個引用別名叫歷史上最傻吊的總統(tǒng),這個引用一定會從一而終,即無論什么時候,歷史上最傻吊的總統(tǒng)一定是特朗普。而美國總統(tǒng)可以當作個指針,一段時間可以是奧巴馬,過一段時間可以是特朗普,再過一段時間可能是nullptr。
引用的主要功能就是作為函數(shù)的參數(shù)和返回值,看一段代碼:
struct A {
int a;
};
void func(const A &a) {
cout << a.a;
}
vector<int> vec(10);
vec[3] = 3;
其實我們平時編程過程中可能也注意到,實際上引用可以做的事情指針都可以做,但為什么還要引用這個東西?
答案:
用恰當?shù)墓ぞ咦銮∪缙浞值墓ぷ?,指針可以毫無約束的操作內存中的任何東西,功能十分強大,但是也很危險,所以可以在恰當?shù)臅r機使用引用,當你需要指向某個東西,而且一定專一,絕不會讓其指向其它東西,例如有些函數(shù)參數(shù)為了避免拷貝可以使用引用,或者實現(xiàn)一個操作符而其語法需求無法由指針達成,例如vec[3]=3,可以使用引用,其它任何時候,都要使用指針。
引用在c++11后其實有很多知識點,具體可以看我之前的文章:
左值引用、右值引用、移動語義、完美轉發(fā),你知道的不知道的都在這里
參考資料
《More Effective C++》
https://www.runoob.com/w3cnote/cpp-difference-between-pointers-and-references.html
https://blog.csdn.net/weikangc/article/details/49762929
https://www.jianshu.com/p/e548a978d737
https://zhuanlan.zhihu.com/p/63096392
-END-
推薦閱讀
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!