C++中引用傳遞與指針傳遞的區(qū)別(面試常見(jiàn))
最近Garena面試的過(guò)程中,面試官提了一個(gè)問(wèn)題,C++中引用傳遞和指針傳遞的區(qū)別?
根據(jù)自己的經(jīng)驗(yàn),聯(lián)想到了swap函數(shù),只知道既可以用引用來(lái)實(shí)現(xiàn),又可以用指針傳遞來(lái)實(shí)現(xiàn),至于二者有何區(qū)別,自己還真沒(méi)有考慮過(guò)。
痛定思痛,受虐之后,趕緊彌補(bǔ)自己的知識(shí)漏洞。
通過(guò)在網(wǎng)上搜集資料,自己也整理了一下。
精簡(jiǎn)版:
指針:變量,獨(dú)立,可變,可空,替身,無(wú)類(lèi)型檢查;
引用:別名,依賴(lài),不變,非空,本體,有類(lèi)型檢查;
完整版:
1. 概念
指針從本質(zhì)上講是一個(gè)變量,變量的值是另一個(gè)變量的地址,指針在邏輯上是獨(dú)立的,它可以被改變的,包括指針變量的值(所指向的地址)和指針變量的值對(duì)應(yīng)的內(nèi)存中的數(shù)據(jù)(所指向地址中所存放的數(shù)據(jù))。
引用從本質(zhì)上講是一個(gè)別名,是另一個(gè)變量的同義詞,它在邏輯上不是獨(dú)立的,它的存在具有依附性,所以引用必須在一開(kāi)始就被初始化(先有這個(gè)變量,這個(gè)實(shí)物,這個(gè)實(shí)物才能有別名),而且其引用的對(duì)象在其整個(gè)生命周期中不能被改變,即自始至終只能依附于同一個(gè)變量(初始化的時(shí)候代表的是誰(shuí)的別名,就一直是誰(shuí)的別名,不能變)。
2. C++中的指針參數(shù)傳遞和引用參數(shù)傳遞
指針參數(shù)傳遞本質(zhì)上是值傳遞,它所傳遞的是一個(gè)地址值。值傳遞過(guò)程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,會(huì)在棧中開(kāi)辟內(nèi)存空間以存放由主調(diào)函數(shù)傳遞進(jìn)來(lái)的實(shí)參值,從而形成了實(shí)參的一個(gè)副本(替身)。值傳遞的特點(diǎn)是,被調(diào)函數(shù)對(duì)形式參數(shù)的任何操作都是作為局部變量進(jìn)行的,不會(huì)影響主調(diào)函數(shù)的實(shí)參變量的值(形參指針變了,實(shí)參指針不會(huì)變)。
引用參數(shù)傳遞過(guò)程中,被調(diào)函數(shù)的形式參數(shù)也作為局部變量在棧中開(kāi)辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函數(shù)放進(jìn)來(lái)的實(shí)參變量的地址。被調(diào)函數(shù)對(duì)形參(本體)的任何操作都被處理成間接尋址,即通過(guò)棧中存放的地址訪(fǎng)問(wèn)主調(diào)函數(shù)中的實(shí)參變量(根據(jù)別名找到主調(diào)函數(shù)中的本體)。因此,被調(diào)函數(shù)對(duì)形參的任何操作都會(huì)影響主調(diào)函數(shù)中的實(shí)參變量。
引用傳遞和指針傳遞是不同的,雖然他們都是在被調(diào)函數(shù)??臻g上的一個(gè)局部變量,但是任何對(duì)于引用參數(shù)的處理都會(huì)通過(guò)一個(gè)間接尋址的方式操作到主調(diào)函數(shù)中的相關(guān)變量。而對(duì)于指針傳遞的參數(shù),如果改變被調(diào)函數(shù)中的指針地址,它將應(yīng)用不到主調(diào)函數(shù)的相關(guān)變量。如果想通過(guò)指針參數(shù)傳遞來(lái)改變主調(diào)函數(shù)中的相關(guān)變量(地址),那就得使用指向指針的指針或者指針引用。
從編譯的角度來(lái)講,程序在編譯時(shí)分別將指針和引用添加到符號(hào)表上,符號(hào)表中記錄的是變量名及變量所對(duì)應(yīng)地址。指針變量在符號(hào)表上對(duì)應(yīng)的地址值為指針變量的地址值,而引用在符號(hào)表上對(duì)應(yīng)的地址值為引用對(duì)象的地址值(與實(shí)參名字不同,地址相同)。符號(hào)表生成之后就不會(huì)再改,因此指針可以改變其指向的對(duì)象(指針變量中的值可以改),而引用對(duì)象則不能修改。
3. 總結(jié)
相同點(diǎn):
都是地址的概念
不同點(diǎn):
指針是一個(gè)實(shí)體(替身);引用只是一個(gè)別名(本體的另一個(gè)名字)
引用只能在定義時(shí)被初始化一次,之后不可改變,即“從一而終”;指針可以修改,即“見(jiàn)異思遷”;
引用不能為空(有本體,才有別名);指針可以為空;
sizeof 引用,得到的是所指向變量的大??;sizeof 指針,得到的是指針的大??;
指針 ++,是指指針的地址自增;引用++是指所指變量自增;
引用是類(lèi)型安全的,引用過(guò)程會(huì)進(jìn)行類(lèi)型檢查;指針不會(huì)進(jìn)行安全檢查;
補(bǔ)充:C語(yǔ)言的引用傳遞方法
#include #include int main(int argc, const char * argv[]){ double pi = 3.14; double intgerPart; double fractionPart; fractionPart = modf(pi, &intgerPart); printf("Pi's Interger Part is %.0f, and Pi's fraction part is %.2f \n", intgerPart, fractionPart); return 0; } Result: Pi's Interger Part is 3, and Pi's fraction part is 0.14 Program ended with exit code: 0
總結(jié)
以上所述是小編給大家介紹的C++中引用傳遞與指針傳遞的區(qū)別(面試常見(jiàn)),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
教你使用Matlab制作圖形驗(yàn)證碼生成器(app designer)
這篇文章主要和大家分享如何利用Matlab制作一款圖形驗(yàn)證碼生成器,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴可以跟隨小編動(dòng)手試一試2022-02-02C++面向行輸入之get()與getline()實(shí)例詳解
在c++里當(dāng)我們輸入一個(gè)字符串時(shí)習(xí)慣用cin,但是cin只能讀取一段不含空格的字符串,如果我們需要讀取一段包含空格的字符串時(shí),就需要用到getline()或get(),下面這篇文章主要給大家介紹了關(guān)于C++面向行輸入之get()與getline()的相關(guān)資料,需要的朋友可以參考下2021-10-10C 語(yǔ)言中strstr函數(shù)實(shí)例詳解
這篇文章主要介紹了C 語(yǔ)言中strstr函數(shù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化
本文主要介紹了QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C++指針作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí)需要注意的一些問(wèn)題
當(dāng)指針作為函數(shù)的參數(shù)進(jìn)行傳遞的時(shí)候,本質(zhì)上還是進(jìn)行的“值傳遞”,也就是復(fù)制了一個(gè)新的指向該地址的指針變量2013-10-10