C 函式中引數的傳遞

2021-07-11 11:35:42 字數 2004 閱讀 8200

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的值。

C 函式的引數傳遞

一 函式未被呼叫前,函式的形參並不占有實際的記憶體空間,也沒有被賦值。只有在被呼叫的時候,才被賦值。函式引數傳遞指的就是形參和實參想結合的過程。二 函式引數傳遞存在兩種形式 1 值傳遞 即函式在發生呼叫時,給形參分配記憶體空間,直接以實參的值初始化形參。函式被賦值後,實參和形參即沒有關係,形參的改變...

C 函式的引數傳遞

所有的函式都使用 在程式執行棧中分配的儲存區。該儲存區一直保持與該函式相關聯,直到函式結束為止。那時,儲存區將自動釋放以便重新使用。該函式的整個儲存區稱為活動記錄。系統在函式的活動記錄中為函式的每個引數都提供了儲存區,引數的儲存長度由它的型別來決定。引數傳遞是指用函式呼叫的實參值來初始化函式引數儲存...

c 函式的引數傳遞

搜 函式的引數傳遞 很多時候看到的是函式的三種傳遞方式 那麼這三種引數傳遞方式有沒有什麼共同點呢?或者說它們的實質到底是怎樣的呢?1 寫乙個帶有引數的函式返回值型別 函式名 形參列表 那麼形參列表怎麼寫呢?其實我們可以按照 定義乙個變數的寫法 來寫形參列表,什麼意思呢?定義乙個int型變數 為 in...