函數的參數類型 指針和指針的引用的區別


其實歸根結底就是傳值傳引用的區別,只不過涉及到指針,理解起來可能稍微復雜一點,大家可以先去看看傳值和傳引用方面的博文。

首先看一個簡單的函數

在兩個斷點處,p1的值分別為

 

 

然后自己隨手寫一個函數fun1,在主函數里調用它

 

我們原本期望的是:通過fun1函數申請一份存放int的內存,然后讓傳進fun1函數的指針指向剛剛申請的內存。

可是最終在兩個斷點處的結果卻是這樣的:

在執行fun1函數后,p1的值依舊為空,也就是說我們的期望沒有成功。

要想實現我們的原本期望,可以分為兩步

第一步:new 一個內存

第二步:讓指針指向我們剛剛 new出來的內存。

實際上,fun1函數確實 new 了一個內存,但是卻沒有做到讓我們傳進去的指針指向 new 出來的內存,所以 p1指針的值才沒有改變(p1的值即為p1所指向的內存的地址)。

這是為什么呢?

這里就涉及到形參和實參傳值和傳引用的概念了:

簡而言之,當我們函數的參數類型不是引用時,當我們將實參(上面主函數的p1)傳進去函數時,函數的形參(fun1函數中的p)的值是通過對實參的復制得到的,即此時形參的值和實參的值是相同的,都為空,但是他們兩個是不同的東西

僅僅指向同一塊內存而已,除此之外,沒有任何聯系。

然后,執行fun1函數體中的new語句,此時的效果是讓形參p指向了new出來的內存和你實參(p1)沒有半毛錢關系,p1原本是啥現在還是啥。

我們可以在fun1函數里打一個斷點進行驗證一下:

剛開始時:p1和p的值相同。

可以看到形參p的值確實改變了。

 

然后再談談傳引用:當函數的參數為引用類型時,當實參傳進函數時,形參不再是僅僅進行一個簡單的復制形參直接成了實參的別名也就是說此時形參和實參就是一個東西,你對形參的操作,都會實時的反映到實參身上。我們可以寫一個fun2函數,將函數參數類型設置為引用類型,就能達到想到的效果了,如圖:

 

ps:上面的代碼我都僅僅new了一下,但是沒有delete這種管殺不管埋的行為,大家千萬不要模仿!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM