函式呼叫的傳值和「傳址」

2021-04-12 22:36:54 字數 1048 閱讀 1914

函式呼叫的傳值和「傳址」

以下文字只想說明乙個問題:所有的引數傳遞都是傳值;要想通過函式改變乙個變數的值,只有將此變數的位址傳入函式。

其實c語言中根本沒有傳址這一

說,所有的函式在傳遞引數時都是採用的傳值呼叫,即在呼叫時完成

實參對形參的賦值,也就是說在傳遞引數時永遠都是將實參的值傳遞給形參。形參是乙個區域性變數,作用域是函式體內,初始化是在函式呼叫時。那經常用到的指標作形參不是傳位址嗎?其實不是。我覺得說傳址的人是為了讓初學者好理解才不得已那麼說的(其實在遇到用於輸出的引數時,如果我在無法給人講清楚,或是想節約口舌時也不得不說這是傳址呼叫)。指標作為形參,在函式呼叫時,傳遞的是指標的值,只不過這個指標是某個變數的位址。

其實這個很好理解,大部分

c語言初學者也能很容易理解。甚至有人會說,這有意思嗎,說傳址只不過理解上簡單而已,其實誰不知道這個阿。但是當輸出引數是指標時,如果簡單的理解為傳址就可能引起錯誤。

看下面連個例子

例一:void swap( int * a, int * b )

例二:void crthandle( void * handle )

而例二中,函式的本意是申請一塊記憶體空間,由引數 handle 將其傳出,但是很遺憾這種傳址沒能達到這個要求。handle 雖然是乙個指標(存放位址的變數),但此時函式的目的是要在內部修改這個變數,要達到這個目的只有將這個變數的位址值傳到函式內部才行,而不是只是看到傳址就簡單的認為ok了。如果把指標也理解為乙個普通變數而不是位址(實際上指標就是存放位址的變數),把引數傳遞全部理解為傳值,這樣這個問題變得就簡單了。就是:如果你想通過函式改變乙個變數的值,則只有將這個變數的位址傳入。像例二中,該函式想改變變數 handle 的值,則在傳遞引數時應將變數 handle 的位址傳入,也就是下面這樣:

void crthandle( void * *handle)

羅嗦了半天,總之一句話:所有的引數傳遞都是傳值;要想通過函式改變乙個變數的值,只有將此變數的位址傳入函式。

傳值呼叫 傳址呼叫

void swap int x,int y int tmp x x y y tmp int main int a 10 int b 20 printf a d b d n a,b swap a,b 傳值呼叫,僅僅是傳值,其實x賦值為10,y賦值為20了,swap函式也用了,printf a d b ...

函式的傳值和傳址呼叫(C語言)

1 傳值呼叫。傳值呼叫顧名思義就是將引數的值傳遞給函式,而函式在進行呼叫時會複製這個值,然後將複製的值在函式中進行呼叫。void swap int a,int b int temp temp a a b b temp int main void int x 1,y 2 swap x,y printf...

傳值呼叫與傳址呼叫

眾所周知,函式的呼叫分為傳值呼叫和傳址呼叫,那他們的區別是什麼呢?傳值呼叫 函式的形參和實參分別占有不同的記憶體塊,對形參的修改不會影響實參。傳址呼叫 傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫函式的方法。這種傳參方式可以讓函式和函式外邊的變數建立起真正的聯絡,也就是函式的內部...