函數調用的傳值和“傳址” 以下文字只想說明一個問題:
所有的參數傳遞都是傳值;要想通過函數改變一個變數的值,只有將此變數的地址傳入函數。 其實C語言中
根本沒有傳址這一說,
所有的函數在傳遞參數時都是採用的傳值調用,即在調用時完成實參對形參的賦值,也就是說在傳遞參數時永遠都是將實參的值傳遞給形參。形參是一個局部變數,範圍是函數體內,初始化是在函數調用時。那經常用到的指標作形參不是傳地址嗎?其實不是。我覺得說傳址的人是為了讓初學者好理解才不得已那麼說的(其實在遇到用於輸出的參數時,如果我在無法給人講清楚,或是想節約口舌時也不得不說這是傳址調用)。指標作為形參,在函數調用時,傳遞的是指標的值,只不過這個指標是某個變數的地址。其實這個很好理解,大部分C語言初學者也能很容易理解。甚至有人會說,這有意思嗎,說傳址只不過理解上簡單而已,其實誰不知道這個阿。但是當輸出參數是指標時,如果簡單的理解為傳址就可能引起錯誤。 看下面連個例子例一:void swap( int * a, int * b ){ int tmp; tmp = a; a = b; b = tmp; }例二:void crtHandle( void * handle ) { handle = malloc( SIZE ); //假設 SIZE 是一個已知的整型量} 在例一中,如果說傳址大家很容易理解。函數將整型變數a 和 b 的地址傳入,通過兩個變數的地址來交換兩個變數的值。 而例二中,函數的本意是申請一塊記憶體空間,由參數 handle 將其傳出,但是很遺憾這種傳址沒能達到這個要求。handle 雖然是一個指標(存放地址的變數),但此時函數的目的是要在內部修改這個變數,要達到這個目的只有將這個變數的地址值傳到函數內部才行,而不是只是看到傳址就簡單的認為OK了。如果把指標也理解為一個普通變數而不是地址(實際上指標就是存放地址的變數),把參數傳遞全部理解為傳值,這樣這個問題變得就簡單了。就是:如果你想通過函數改變一個變數的值,則只有將這個變數的地址傳入。像例二中,該函數想改變變數 handle 的值,則在傳遞參數時應將變數 handle 的地址傳入,也就是下面這樣:void crtHandle( void * *handle) { *handle = malloc( SIZE );} 羅嗦了半天,總之一句話:
所有的參數傳遞都是傳值;要想通過函數改變一個變數的值,只有將此變數的地址傳入函數。