1. 程式人生 > >C++中值傳遞和引用傳遞的區別

C++中值傳遞和引用傳遞的區別

    最近補資料結構和演算法時,捎帶著學了些C++,剛好看到一篇關於值傳遞和引用傳遞的文章,收穫頗豐,這裡分享一下學習心得,當然,C#中也差不多。

    C++中引數的傳遞方式:

1.值傳遞

    呼叫時,將實參的值傳遞對應的形參,即為值傳遞。由於形參有自己獨立的儲存空間,又作為函式的區域性變數使用,因此在函式中對任何形參值得修改都不會改變實參變數的值。簡單的看一個例子:


編譯後,輸出結果如下所示:


從上圖可以看出,主函式聲明瞭兩個全域性變數a,b並對其賦值1,2;通過函式Swp()函式呼叫之後,在函式內部將a和b的值交換了,使得函式內,a=2,b=1;但是,這個過程並沒有改變全域性變數a和b的值。

我們分析一下函式的呼叫過程:函式Swap()被呼叫前,實參a和b有自己的儲存空間,並且有自己的初始值。當呼叫函式Swap()時,為形參(即函式的引數)x和y分配儲存空間,並將a和b的值複製過來,函式執行過程中,將x和y的值進行交換,當函式執行結束之後,x和y所佔用的儲存空間將被釋放,這種傳遞的方式,並不會對實參a和b的值產生影響,此即為值傳遞。

2.引用傳遞

    引用傳遞是一種特殊的變數,它被認為是一個變數的別名。當定義一個引用時,其實是為目標變數起一個別名,引用並不分配獨立的記憶體空間,它與目標變數公用其記憶體空間,當定義一個引用時,如果該引用不是用作函式的引數或者返回值,則必須提供該引用的初始值(即必須提供引用的目標變數名)如圖:

b變數引用了a變數,可知a和b的值相等,均公用同一塊記憶體地址,即變數b是a變數的一個別名。

將上面的值傳遞的示例程式碼修改為引用傳遞如下圖所示:


編譯執行,輸出結果如下所示:


當函式未呼叫之前,實參a和b的值分別為1和2。當函式呼叫過程中,形參的值被交換,即a=2,b=1;函式呼叫結束之後,實參的值被改變。即函式呼叫時,作為形參的引用變數並不分配新的記憶體空間,它將作為實參變數的別名與其共用記憶體。

    說明:使用引用引數可以直接操作實參變數,從而能夠實現通過修改形參的值而達到修改對應實參值得目的。當引用作為函式形參,其引用的目標變數沒人為呼叫該函式時對應的實參變數名,所以,在定義函式時,對於引用型別引數不必提供引用的初始值。

    歡迎關注我的公眾號,會不定期的分享:設計模式、C++、資料結構和演算法、Unity相關的文章: