C++中引用傳遞與指針傳遞的區(qū)別(面試常見)
最近Garena面試的過程中,面試官提了一個問題,C++中引用傳遞和指針傳遞的區(qū)別?
根據(jù)自己的經(jīng)驗,聯(lián)想到了swap函數(shù),只知道既可以用引用來實現(xiàn),又可以用指針傳遞來實現(xiàn),至于二者有何區(qū)別,自己還真沒有考慮過。
痛定思痛,受虐之后,趕緊彌補自己的知識漏洞。
通過在網(wǎng)上搜集資料,自己也整理了一下。
精簡版:
指針:變量,獨立,可變,可空,替身,無類型檢查;
引用:別名,依賴,不變,非空,本體,有類型檢查;
完整版:
1. 概念
指針從本質上講是一個變量,變量的值是另一個變量的地址,指針在邏輯上是獨立的,它可以被改變的,包括指針變量的值(所指向的地址)和指針變量的值對應的內(nèi)存中的數(shù)據(jù)(所指向地址中所存放的數(shù)據(jù))。
引用從本質上講是一個別名,是另一個變量的同義詞,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化(先有這個變量,這個實物,這個實物才能有別名),而且其引用的對象在其整個生命周期中不能被改變,即自始至終只能依附于同一個變量(初始化的時候代表的是誰的別名,就一直是誰的別名,不能變)。
2. C++中的指針參數(shù)傳遞和引用參數(shù)傳遞
指針參數(shù)傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函數(shù)的形式參數(shù)作為被調函數(shù)的局部變量處理,會在棧中開辟內(nèi)存空間以存放由主調函數(shù)傳遞進來的實參值,從而形成了實參的一個副本(替身)。值傳遞的特點是,被調函數(shù)對形式參數(shù)的任何操作都是作為局部變量進行的,不會影響主調函數(shù)的實參變量的值(形參指針變了,實參指針不會變)。
引用參數(shù)傳遞過程中,被調函數(shù)的形式參數(shù)也作為局部變量在棧中開辟了內(nèi)存空間,但是這時存放的是由主調函數(shù)放進來的實參變量的地址。被調函數(shù)對形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數(shù)中的實參變量(根據(jù)別名找到主調函數(shù)中的本體)。因此,被調函數(shù)對形參的任何操作都會影響主調函數(shù)中的實參變量。
引用傳遞和指針傳遞是不同的,雖然他們都是在被調函數(shù)??臻g上的一個局部變量,但是任何對于引用參數(shù)的處理都會通過一個間接尋址的方式操作到主調函數(shù)中的相關變量。而對于指針傳遞的參數(shù),如果改變被調函數(shù)中的指針地址,它將應用不到主調函數(shù)的相關變量。如果想通過指針參數(shù)傳遞來改變主調函數(shù)中的相關變量(地址),那就得使用指向指針的指針或者指針引用。
從編譯的角度來講,程序在編譯時分別將指針和引用添加到符號表上,符號表中記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值(與實參名字不同,地址相同)。符號表生成之后就不會再改,因此指針可以改變其指向的對象(指針變量中的值可以改),而引用對象則不能修改。
3. 總結
相同點:
都是地址的概念
不同點:
指針是一個實體(替身);引用只是一個別名(本體的另一個名字)
引用只能在定義時被初始化一次,之后不可改變,即“從一而終”;指針可以修改,即“見異思遷”;
引用不能為空(有本體,才有別名);指針可以為空;
sizeof 引用,得到的是所指向變量的大??;sizeof 指針,得到的是指針的大?。?/p>
指針 ++,是指指針的地址自增;引用++是指所指變量自增;
引用是類型安全的,引用過程會進行類型檢查;指針不會進行安全檢查;
補充:C語言的引用傳遞方法
#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
總結
以上所述是小編給大家介紹的C++中引用傳遞與指針傳遞的區(qū)別(面試常見),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:總結c++性能優(yōu)化策略
欄 目:C語言
本文標題:C++中引用傳遞與指針傳遞的區(qū)別(面試常見)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/846.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內(nèi)存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10C#中split用法實例總結
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


