2-5:C++快速入门之引用,引用和指针的区别
文章目錄
- (1)引用的概念
- (2)引用的特點(diǎn)
- (3)常引用
- (4)引用的應(yīng)用場(chǎng)景
- A:做參數(shù)
- B:做返回值
- (5)引用和指針
在第一次學(xué)習(xí)C語(yǔ)言指針時(shí),許多教材上都會(huì)給出一個(gè)交換兩個(gè)變量值的例子,開(kāi)始我們認(rèn)為這樣交換就可以成功
void swap(int a,int b) {int temp=a;a=b;b=temp; }int main() {int a=1;int b=2;swap(a,b); }但學(xué)習(xí)完指針后,就明白了這樣的操作是不行的,因?yàn)槊慨?dāng)調(diào)用函數(shù)時(shí)就會(huì)為該函數(shù)開(kāi)辟一個(gè)新的空間,函數(shù)結(jié)束之后,空間也就被銷(xiāo)毀了,所以不可能交換成功。于是正確的寫(xiě)法應(yīng)該是這樣
void swap(int* x,int* y) {int temp=*x;*x=*y;*y=temp; }int main() {int a=1;int b=2;swap(&a,&b); }而在C++中我們引入一個(gè)新的概念——引用
- 但是請(qǐng)放心,引用的底層實(shí)現(xiàn)依然依靠的是指針
(1)引用的概念
簡(jiǎn)單點(diǎn)來(lái)說(shuō):引用就是起別名,這一片內(nèi)存空間名字叫a,然后再給它額外起一個(gè)名字,叫做b,a和b操控的是同一片內(nèi)存空間。
從下面的這個(gè)動(dòng)態(tài)調(diào)試的過(guò)程中,大家可以深刻的體會(huì)到取別名的意思
(2)引用的特點(diǎn)
(3)常引用
在C語(yǔ)言中我們知道,如果定義一個(gè)常整形,表示這個(gè)整形變量?jī)?nèi)容是不可以修改的,所以如果用普通引用去引用就會(huì)出錯(cuò)
int main() {const int a=10;int& b=a;//錯(cuò)誤,權(quán)限被放大,之前只可讀,賦值后卻可讀可寫(xiě)了 }那么面對(duì)這樣的變量,如果仍然使用之前的引用方式是不可行的。這涉及到一個(gè)權(quán)限問(wèn)題:變量a自身只能可讀,但是它被int& b引用后,反倒可以修改了,這就矛盾了。所以要解決這種權(quán)限問(wèn)題,必須使用常引用
int main() {const int a=10;const int& b=a;//常引用 }- 指針和引用在賦值時(shí),權(quán)限不能放大,但是可以縮小(這也就是為什么 int strlen(const char* str)中形參是const類型的)
- 常數(shù)具有常性,所以引用常數(shù)時(shí),必須使用常引用
- C語(yǔ)言中,浮點(diǎn)型轉(zhuǎn)換為整型時(shí),有一個(gè)中間過(guò)程,會(huì)涉及到一個(gè)中間變量,這個(gè)中間變量具有常性,必須使用常引用
關(guān)于常引用,確實(shí)C++在這方面有點(diǎn)麻煩,但是這個(gè)常引用也是有好處的,尤其體現(xiàn)在引用做形參。我們一般使用常引用作為形參,此時(shí)實(shí)參可以是變量也可以是常量,即便實(shí)參和形參存在類型轉(zhuǎn)換也是無(wú)妨的
void test(const DataType& x) {//形參使用常引用好處多多 }(4)引用的應(yīng)用場(chǎng)景
A:做參數(shù)
我們現(xiàn)在就可以使用引用的方式交換兩個(gè)變量了
void Swap(int& x,int &y) {int temp=x;x=y;y=temp; }int main() {int a=1;int b=2;Swap(a,b); }B:做返回值
實(shí)參傳給形參時(shí),如果不用指針或引用,那么形參就要拷貝一份,這一點(diǎn)相信大家是很明白的。但我們?nèi)菀缀雎缘囊稽c(diǎn)是——函數(shù)的返回值也屬于傳值,也就是說(shuō)它不會(huì)將內(nèi)容直接返回給調(diào)用該函數(shù)并接受返回值的變量,而是先給寄存器或內(nèi)存(如果數(shù)據(jù)大的話要開(kāi)辟更多空間)
- ret先給“臨時(shí)空間”,然后“臨時(shí)空間”再給receive
所以,引用也可以用于返回值。函數(shù)返回設(shè)為引用,然后在調(diào)用它的地方也進(jìn)行引用,相當(dāng)于只進(jìn)行一次拷貝。
通過(guò)調(diào)試可以發(fā)現(xiàn),receive和ret地址是一樣的,他們都是那一片內(nèi)存空間的別名。
這里我們?cè)诤竺嬖僬{(diào)用一次sum函數(shù),最終輸出結(jié)果為7
使用調(diào)試,感受到這個(gè)過(guò)程
而如果再加入一句毫不相干的代碼,會(huì)發(fā)現(xiàn)最后輸出的竟然是一個(gè)隨機(jī)值?其實(shí)這是因?yàn)榈竭@里的時(shí)候ret早就還給系統(tǒng)了。
所以:如果函數(shù)返回時(shí),已經(jīng)出了作用域,但此時(shí)假如返回對(duì)象還未歸還給系統(tǒng),那么可以使用引用返回,但是如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。
(5)引用和指針
語(yǔ)法角度上講,引用是實(shí)體的別名,與實(shí)體共用統(tǒng)一內(nèi)存空間,而從底層實(shí)現(xiàn)角度上講,引用其實(shí)是按照指針的方式進(jìn)行的
從匯編角度可以看出這一點(diǎn)
引用和指針的區(qū)別如下
| 引用定義必須初始化 | 指針沒(méi)有要求 |
| 引用只能一個(gè)實(shí)體 | 指針在任何時(shí)候指向任何同類型的實(shí)體 |
| 沒(méi)有NULL引用 | 但有NULL指針 |
| 使用sizeof()表示引用類型的大小 | 使用sizeof表示地址空間所占字節(jié)數(shù) |
| ++引用表示引用的實(shí)體增加1 | ++指針表示指針向后偏移一個(gè)類型的大小(字節(jié)) |
| 沒(méi)有多級(jí)引用 | 但有多級(jí)指針 |
| 引用較安全 | 指針較不安全 |
總結(jié)
以上是生活随笔為你收集整理的2-5:C++快速入门之引用,引用和指针的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 推动Windows的限制:USER和GD
- 下一篇: docker network