C 中引用傳遞與指標傳遞的區別

2022-02-03 02:44:46 字數 1558 閱讀 1704

最近garena面試的過程中,面試官提了乙個問題,c++中引用傳遞和指標傳遞的區別?

根據自己的經驗,聯想到了swap函式,只知道既可以用引用來實現,又可以用指標傳遞來實現,至於二者有何區別,自己還真沒有考慮過。

痛定思痛,受虐之後,趕緊彌補自己的知識漏洞。

通過在網上蒐集資料,自己也整理了一下。

精簡版:

指標:變數,獨立,可變,可空,替身,無型別檢查;

引用:別名,依賴,不變,非空,本體,有型別檢查;

完整版:

1. 概念

指標從本質上講是乙個變數,變數的值是另乙個變數的位址,指標在邏輯上是獨立的,它可以被改變的,包括指標變數的值(所指向的位址)和指標變數的值對應的記憶體中的資料(所指向位址中所存放的資料)。

引用從本質上講是乙個別名,是另乙個變數的同義詞,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化(先有這個變數,這個實物,這個實物才能有別名),而且其引用的物件在其整個生命週期中不能被改變,即自始至終只能依附於同乙個變數(初始化的時候代表的是誰的別名,就一直是誰的別名,不能變)。

2. c++中的指標引數傳遞和引用引數傳遞

指標引數傳遞本質上是值傳遞,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,會在棧中開闢記憶體空間以存放由主調函式傳遞進來的實參值,從而形成了實參的乙個副本(替身)。值傳遞的特點是,被調函式對形式引數的任何操作都是作為區域性變數進行的,不會影響主調函式的實參變數的值(形參指標變了,實參指標不會變)。

引用引數傳遞過程中,被調函式的形式引數也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參(本體)的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數(根據別名找到主調函式中的本體)。因此,被調函式對形參的任何操作都會影響主調函式中的實參變數。

引用傳遞和指標傳遞是不同的,雖然他們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將應用不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數(位址),那就得使用指向指標的指標或者指標引用。

從編譯的角度來講,程式在編譯時分別將指標和引用新增到符號表上,符號表中記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值(與實參名字不同,位址相同)。符號表生成之後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。

3. 總結

相同點:

都是位址的概念

不同點:

指標是乙個實體(替身);引用只是乙個別名(本體的另乙個名字)

引用只能在定義時被初始化一次,之後不可改變,即「從一而終」;指標可以修改,即「見異思遷」;

引用不能為空(有本體,才有別名);指標可以為空;

sizeof 引用,得到的是所指向變數的大小;sizeof 指標,得到的是指標的大小;

指標 ++,是指指標的位址自增;引用++是指所指變數自增;

引用是型別安全的,引用過程會進行型別檢查;指標不會進行安全檢查;

值傳遞,指標傳遞,引用傳遞 的區別

值傳遞,指標傳遞,引用傳遞 的區別 值傳遞 從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出 形參為實參的拷貝,形參有單獨的記憶體空間,當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞 指標傳遞 指標傳遞向形參傳遞的為實參的位址,即形參為乙個指向實參位...

值傳遞 指標傳遞 引用傳遞的區別

1.值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。1 void swap int a,intb 2 910intmain 用gdb除錯後...

值傳遞 指標傳遞 引用傳遞的區別

1.值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。void swap int a,int b int main int change2 ...