www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]先拋出兩個(gè)問(wèn)題: 指針和引用有什么區(qū)別? 什么時(shí)候應(yīng)該使用指針?什么時(shí)候應(yīng)該使用引用? 01 指針和引用的區(qū)別 首先看一段代碼: int a = 1;int b = 2;int *c = nullptr;c = &a;int &d = b; 指針其實(shí)就是一個(gè)存放內(nèi)存地址的整數(shù),這個(gè)整數(shù)表示的是被指向的變

先拋出兩個(gè)問(wèn)題:

  • 指針和引用有什么區(qū)別?

  • 什么時(shí)候應(yīng)該使用指針?什么時(shí)候應(yīng)該使用引用?

01
指針和引用的區(qū)別


首先看一段代碼:

int a = 1;int b = 2;int *c = nullptr;c = &a;int &d = b;

指針其實(shí)就是一個(gè)存放內(nèi)存地址的整數(shù),這個(gè)整數(shù)表示的是被指向的變量的地址。

引用其實(shí)就是變量的別名,就是給變量重新起了一個(gè)名字,注意引用既然是個(gè)別名,那它一定要有本體,一個(gè)人叫王二小,我們也可以給它起個(gè)別名叫二蛋,我們提到二蛋和王二小其實(shí)都是同一個(gè)人。

區(qū)別:

  • 指針在聲明時(shí)可以暫時(shí)不初始化,即pointer = nullptr,指針在生命周期內(nèi)隨時(shí)都可能是空指針,所以在每次使用時(shí)都要做檢查,防止出現(xiàn)空指針異常問(wèn)題,而引用卻不需要做檢查,因?yàn)橐糜肋h(yuǎn)都不會(huì)為空,它一定有本體,一定得代表某個(gè)對(duì)象,引用在創(chuàng)建的同時(shí)必須被初始化。

void FuncPtr(int *ptr) { if (ptr != nullptr) { cout << *ptr; }}
void FuncReference(int &ref) { cout << ref;}
  • 指針存放的是地址,指針可以被重新賦值,可以在初始化時(shí)指向一個(gè)對(duì)象,在其它時(shí)刻也可以指向另一個(gè)對(duì)象,而引用非常專(zhuān)一,它會(huì)從一而終,它總是指向它最初代表的那個(gè)對(duì)象。再舉個(gè)例子,有一個(gè)人叫特朗普,為他起個(gè)引用別名叫歷史上最傻吊的總統(tǒng),這個(gè)引用一定會(huì)從一而終,即無(wú)論什么時(shí)候,歷史上最傻吊的總統(tǒng)一定是特朗普。而美國(guó)總統(tǒng)可以當(dāng)作個(gè)指針,一段時(shí)間可以是奧巴馬,過(guò)一段時(shí)間可以是特朗普,再過(guò)一段時(shí)間可能是nullptr。


02
指針和引用的使用場(chǎng)景


引用的主要功能就是作為函數(shù)的參數(shù)和返回值,看一段代碼:

struct A { int a;};void func(const A &a) { cout << a.a;}
vector<int> vec(10);vec[3] = 3;
為什么通過(guò)vec[3] =3可以改變vector容器的值,因?yàn)閇]操作符返回的就是引用,相當(dāng)于為內(nèi)部的變量起了一個(gè)別名,這里還可以讓[]操作符返回一個(gè)指針,即*vec[3]=3,這是不是有點(diǎn)丑,而且不符合語(yǔ)法需求。

其實(shí)我們平時(shí)編程過(guò)程中可能也注意到,實(shí)際上引用可以做的事情指針都可以做,但為什么還要引用這個(gè)東西?

答案:

用恰當(dāng)?shù)墓ぞ咦銮∪缙浞值墓ぷ?,指針可以毫無(wú)約束的操作內(nèi)存中的任何東西,功能十分強(qiáng)大,但是也很危險(xiǎn),所以可以在恰當(dāng)?shù)臅r(shí)機(jī)使用引用,當(dāng)你需要指向某個(gè)東西,而且一定專(zhuān)一,絕不會(huì)讓其指向其它東西,例如有些函數(shù)參數(shù)為了避免拷貝可以使用引用,或者實(shí)現(xiàn)一個(gè)操作符而其語(yǔ)法需求無(wú)法由指針達(dá)成,例如vec[3]=3,可以使用引用,其它任何時(shí)候,都要使用指針。



引用在c++11后其實(shí)有很多知識(shí)點(diǎn),具體可以看我之前的文章:

左值引用、右值引用、移動(dòng)語(yǔ)義、完美轉(zhuǎn)發(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



本文授權(quán)轉(zhuǎn)載自公眾號(hào)“程序喵大人”,作者程序喵大人

-END-




推薦閱讀



【01】該不該放棄單片機(jī)、嵌入式這條路?
【02】常用于單片機(jī)的接口適配器模式C語(yǔ)言實(shí)現(xiàn)
【03】單片機(jī)編程:如何喂狗的靈魂拷問(wèn),看門(mén)狗那些事兒!
【04】單片機(jī)學(xué)習(xí)筆記,三個(gè)步驟教你學(xué)!
【05】來(lái),看看你的單片機(jī)程序有多大!


免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉