其實歸根結底就是傳值和傳引用的區別,只不過涉及到指針,理解起來可能稍微復雜一點,大家可以先去看看傳值和傳引用方面的博文。
首先看一個簡單的函數
在兩個斷點處,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,這種管殺不管埋的行為,大家千萬不要模仿!