函數調用的傳值和“傳址”

來源:互聯網
上載者:User
 

函數調用的傳值和“傳址”        以下文字只想說明一個問題: 所有的參數傳遞都是傳值;要想通過函數改變一個變數的值,只有將此變數的地址傳入函數。         其實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 );}         羅嗦了半天,總之一句話: 所有的參數傳遞都是傳值;要想通過函數改變一個變數的值,只有將此變數的地址傳入函數。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.