首先:
c++中引數傳遞方式:
一般來說,
c裡面有兩種傳遞
1、值傳遞
2、指標傳遞
嚴格來看,只有一種傳遞,值傳遞,指標傳遞也是按值傳遞的,複製的是位址。
c++裡面有三種傳遞方法:
1、值傳遞
2、指標傳遞
3、引用傳遞
但是嚴格來看,是兩種,其實指標傳遞也是值傳遞,只不過是值傳遞的是位址。
下面是部分**:
先看源**,編譯環境是vc6.0,因為除錯方便。功能是要實現a和b值的交換。
1//2共有四個函式,其中有兩個是指標傳遞,但函式體內的實現不一樣。下面具體分析//34 #include "
stdafx.h
"5 #include 6
7using
namespace
std;89
//值傳遞
10void swap1(int p,int
q)11
1718
//指標傳遞,函式體內只有指標值的變化
19void swap2(int *p,int *q)
2026
27//
指標傳遞,函式體內只有指標的變化
28void swap3(int *p,int *q)
2935
36//
引用傳遞
37void swap4(int &p,int &q)
3844
45int
main()
46
1.值傳遞
swap1函式實現的值傳遞,值傳遞傳遞的是實際引數的乙個副本,如果對這句話不理解,那一步步除錯看下記憶體分配情況。
執行到48行時,a和b的情況如下
接著進入swap1函式體內,如下所示
可以看到的是,p和q的位址和a與b的位址不一樣,只是把a和b的值拷貝過去了,在swap1中對p和q操作只是對臨時分配的棧中內容進行操作,函式執行完後形參就消失了,對原來的a和b不產生任何影響。所以swap1不能完成交換a和b值的功能
2.指標傳遞
swap2和swap3都是指標傳遞,swap2函式體內交換了p和q指向位址的值,swap3函式體內交換了p和q指向的位址。
先說swap2,進入swap2函式體內,如下所示
可以看到,形參指標p和q指向的是a和b的位址,而不是像值傳遞那樣將實參的值拷貝到另外分配的位址中,執行到函式尾時,如下圖
可以看到、指標p和q指向的位址沒變,但位址中的值變了,也即a和b位址中的變了,就是a和b的值成功交換,繼續除錯可以看到正確的結果,如下圖
再來看swap3,swap3執行到函式尾時的情況如下
可以看到p和q交換了位址,但最後函式執行完後的結果又如下所示
a和b的值並未交換,這是為什麼呢?
swap3中,形參p和q會儲存在棧中,p指向a的位址,q指向b的位址,使用temp指標完成了p和q的位址交換,即p指向b的位址,q指向了a的位址,但a和b位址中的值並未發生變化,這與swap2不同,swap2中是p指向的位址中的值(就是a)與q指向的位址中的值(b)交換,所以swap2執行完後a和b的值是交換了的。
3.引用傳遞
引用傳遞時,對形參的操作等同於對實參的操作,即傳遞的不會是實參的副本,而就是實參,進入swap4函式體內如下所示
看到這個記憶體分配,很明了了吧。最後會交換a和b的值。
到此,完了。當然函式引數也可以是指向指標的指標,這也是很常見的,但通常用在需要動態分配記憶體的地方以避免記憶體洩露。在使用cuda時呼叫cudamalloc其引數就是這樣,指向指標的指標。而malloc、cplmolloc、new這些是通過返回值傳遞分配的動態記憶體的,自然是不會出現記憶體洩露的,這個後面再說。
C C 中函式引數傳遞詳解
昨天看了記憶體管理的有關內容,有一點了解,但不是很深入,發現之前寫 時有很多細節問題沒有注意到,只知道這樣做可以實現功能,卻不知道為什麼可以這樣,對於採用自己的方法造成的隱患也未知,更不曉得還有其他方法可以實現,我們知道c 強大的乙個原因是因為對於乙個問題的答案多種解答方法或思路,我想著也許就是它難...
C C 中函式引數傳遞詳解
昨天看了記憶體管理的有關內容,有一點了解,但不是很深入,發現之前寫 時有很多細節問題沒有注意到,只知道這樣做可以實現功能,卻不知道為什麼可以這樣,對於採用自己的方法造成的隱患也未知,更不曉得還有其他方法可以實現,我們知道c 強大的乙個原因是因為對於乙個問題的答案多種解答方法或思路,我想著也許就是它難...
C C 中函式引數傳遞詳解
c或c 中函式的引數傳遞包括 值傳遞 指標傳遞 引用傳遞這三種方法,這三種方法在 程式設計師面試寶典 中說的很明了,這裡加上我自己的理解。先看源 編譯環境是vc6.0,因為除錯方便。功能是要實現a和b值的交換。2 3 4 include stdafx.h 5 include 6 7 using na...