詳談C++引用&和指針在作為形參時(shí)的區(qū)別
int n;
int &m = n;
在C++中,多了一個(gè)C語(yǔ)言沒(méi)有的引用聲明符&,如上,m就是n的引用,簡(jiǎn)單的說(shuō)m就是n的別名,兩者在內(nèi)存中占同樣的位置,不對(duì)m開(kāi)辟新的內(nèi)存空間,對(duì)m的任何操作,對(duì)n來(lái)說(shuō)是一樣的。
對(duì)于引用,有以下三條規(guī)則:
(1)引用被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化)。
(2)不能有NULL 引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)(指針則可以是NULL)。
(3)一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時(shí)改變所指的對(duì)象)。
假如在一個(gè)函數(shù)中動(dòng)態(tài)申請(qǐng)內(nèi)存空間,用指針和用引用作形參會(huì)得到不同的結(jié)果,如下面的例子:
void fun(int* &b){ //用引用做形參 b = (int*)malloc(sizeof(int)*3); for(int i=0; i<3; i++){ b[i] = i; } }
如果在main函數(shù)中定義了一個(gè)int型的空指針并分別作為實(shí)參傳入,如下:
int main(){ int *a = NULL; fun(a); for(int i=0; i<3; i++){ cout << a[i] << " "; } cout << "/n"; return 0; }
結(jié)果用指針的函數(shù)會(huì)出現(xiàn)內(nèi)存訪問(wèn)出錯(cuò),用引用的函數(shù)則運(yùn)行正常并正確輸出1 2 3.
這是因?yàn)椋?/strong>
1. 指針雖然是地址傳遞,但實(shí)際上也是在函數(shù)中又定義了一個(gè)新的指針讓其與傳入的指針指向同一地址。但兩個(gè)指針本身作為變量在內(nèi)存中的存放地址是不同的,就是說(shuō)這是兩個(gè)不同的變量,只是內(nèi)容(即所指地址)相同。
2. 在函數(shù)中對(duì)新定義的指針動(dòng)態(tài)申請(qǐng)內(nèi)存,但是當(dāng)函數(shù)結(jié)束后,申請(qǐng)的內(nèi)存的生命周期也就結(jié)束了,所以當(dāng)回到主函數(shù)時(shí),作為實(shí)參的指針地址和內(nèi)容都沒(méi)有變化。仍然是個(gè)空指針,對(duì)其進(jìn)行訪問(wèn)自然出現(xiàn)了內(nèi)存讀錯(cuò)誤了。
假如在main函數(shù)中這樣寫(xiě):
int *a = (int*)malloc(sizeof(int)*3);
就不會(huì)出現(xiàn)內(nèi)存讀錯(cuò)誤了,但是輸出結(jié)果還是錯(cuò)誤的,道理也是一樣的。
3. 用引用作為實(shí)參傳入時(shí),fun函數(shù)中的b其實(shí)就是主函數(shù)中a的別名(或者叫外號(hào)),反正就是操作完全相同,地址相同,內(nèi)容相同的一個(gè)變量,所以當(dāng)fun函數(shù)返回時(shí),對(duì)b的操作在主函數(shù)中對(duì)a同樣有效。
再看一個(gè)例子:
int *a = NULL; char* b = (char*)a; int *a = NULL; char* &b = (char*)a;
這一次是在編譯階段的區(qū)別:
用指針可以通過(guò)編譯,而用引用則不可以,提示類(lèi)型轉(zhuǎn)換出錯(cuò)。
通過(guò)這兩個(gè)例子可以看出,指針比引用靈活,也更加危險(xiǎn)。
摘自『高質(zhì)量c++編程』
條款一:指針與引用的區(qū)別
指針與引用看上去完全不同(指針用操作符'*'和'->',引用使用操作符'.'),但是它們似乎有相同的功能。指針與引用都是讓你間接引用其他對(duì)象。你如何決定在什么時(shí)候使用指針,在什么時(shí)候使用引用呢?
首先,要認(rèn)識(shí)到在任何情況下都不能用指向空值的引用。一個(gè)引用必須總是指向某些對(duì)象。因此如果你使用一個(gè)變量并讓它指向一個(gè)對(duì)象,但是該變量在某些時(shí)候也可能不指向任何對(duì)象,這時(shí)你應(yīng)該把變量聲明為指針,因?yàn)檫@樣你可以賦空值給該變量。相反,如果變量肯定指向一個(gè)對(duì)象,例如你的設(shè)計(jì)不允許變量為空,這時(shí)你就可以把變量聲明為引用。
PS:引用在定義時(shí)不可加const,否則編譯出錯(cuò),在形參前面則可以加const以確保在函數(shù)中該變量不會(huì)被修改。
以上這篇詳談C++引用&和指針在作為形參時(shí)的區(qū)別就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:C#中static void Main(string[] args) 參數(shù)示例詳解
欄 目:C#教程
下一篇:WPF/Silverlight實(shí)現(xiàn)圖片局部放大的方法分析
本文標(biāo)題:詳談C++引用&和指針在作為形參時(shí)的區(qū)別
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5835.html
您可能感興趣的文章
- 01-10C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- 01-10理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類(lèi)引用的區(qū)別
- 01-10淺談C#中的值類(lèi)型和引用類(lèi)型
- 01-10C#調(diào)用Java方法實(shí)例詳解
- 01-10關(guān)于finalize機(jī)制和引用、引用隊(duì)列的用法詳解
- 01-10C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案
- 01-10C# 泛型的約束
- 01-10詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換
- 01-10淺析C# 中的類(lèi)型系統(tǒng)(值類(lèi)型和引用類(lèi)型)
- 01-10C# 7.0之ref locals and returns(局部變量和引用返回)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載