c語言函數傳參詳解


24.1.普通變量作為函數形參 (1)普通變量作為參數在函數傳參時,形參和實參名字可以相同也可以不同,實際上都是用實參來替代相應的形參的。 (2)在字函數內部,形參的值等於實參。原因是函數調用時把實參的值賦值給了形參。這就是所謂的”傳值調用”,相當於實參做右值,形參做左值。


24.2.數組和指針作為函數形參 (1)函數名作為形參傳參時,實際傳遞是不是整個數組,而是數組的首元素的首地址。所以在子函數內部,傳進來的數組名就等於是一個指向數組首元素首地址的指針。所以sizeof得到的是4。 (2)在子函數內傳參得到的數組首元素首地址,和外面得到的數組首元素首地址是相同的。這就是所謂的”傳址調用”,即調用子函數時傳了地址,此時可通過傳進去的地址訪問實參。 (3)數組名作為函數形參時,[]里的數字可有可無。因為數組名做為形參傳遞的實際只是個指針,根本沒有數組長度這個信息。 (4)指針作為函數形參時和數組作為函數形參是一樣的.這就好像指針方式訪問數組元素和數組方式訪問數組元素的結果一樣是一樣的。


24.3.結構體變量作為函數形參 (1)結構體變量作為函數形參的時候,實際上和普通變量(類似於int之類的)傳參時表現是一模一樣的。所以說結構體變量其實也是普通變量而已。 (2)因為結構體一般都很大,所以如果直接用結構體變量進行傳參,那么函數調用效率就會很低。(因為在函數傳參的時候需要將實參賦值給形參,所以當傳參的變量越大調用效率就會越低)。為提高效率,我們可改傳變量的指針(地址)進去。 (3)結構體因為自身太大,所以傳參應該用指針來傳(但是程序員可以自己決定,你非要傳結構體變量過去C語言也是允許的,只是效率低了)。


24.4.傳值調用與傳址調用 (1)傳值調用描述的是這樣一種現象:x和y作為實參,自己並沒有真身進入swap1函數內部,而只是拷貝了一份自己的副本(副本具有和自己一樣的值,但是是不同的變量)進入子函數swap1,然后我們在子函數swap1中交換的實際是副本而不是x、y真身。所以在swap1內部確實是交換了,但是到外部的x和y根本沒有受影響。 (2)在swap2中x和y真的被改變了(但是x和y真身還是沒有進入swap2函數內,而是swap2函數內部跑出來把外面的x和y真身改了)。實際上實參x和y永遠無法真身進入子函數內部(進去的只能是一份拷貝),但是在swap2我們把x和y的地址傳進去給子函數了,於是乎在子函數內可以通過指針解引用方式從函數內部訪問到外部的x和y真身,從而改變x和y。 (3)結論:這個世界上根本沒有傳值和傳址這兩種方式,C語言本身函數調用時一直是傳值的,只不過傳的值可以是變量名,也可以是變量的指針。 


24.5.函數形參和返回值 (1)函數名是一個符號,表示整個函數代碼段的首地址,其實質是一個指針常量,所以在程序中使用到函數名時都是當地址用的,表示調用該函數。函數體是函數的關鍵,由一對{}括起來,包含很多句代碼,函數體就是函數實際做的工作。形參列表和返回值,形參是函數的輸入部分,返回值是函數的輸出部分。 (2)若沒有形參列表和返回值,函數也能對數據進行加工,使用全局變量即可。用全局變量來傳參和用函數參數列表返回值來傳參各有特點,在實踐中都有使用。總的來說,函數參數傳參用得較多,因為這樣可實現模塊化編程,而C語言中也是盡量減少使用全局變量。 (3)全局變量傳參最大的好處就是省略了函數傳參的開銷,所以效率要高一些;但是實戰中用的最多的還是函數傳參,如果參數很多傳參開銷非常大,通常的做法是把很多參數打包成一個結構體,然后傳結構體變量指針進去。


24.6.函數傳參中使用const指針 (1)const用來修飾指針作函數傳參,就是為了聲明在函數內部不會改變該指針所指向的變量。所以給該函數傳一個不可改變的指針(譬如char *p = “linux”; 字符串常量,放在代碼段中,不可改變)后,一旦該函數內部試圖更改它時編譯器會提示錯誤;而一個未聲明為const指針參數的函數,我們給該函數傳一個不可更改的指針時,一旦該函數內部更改它后,編譯器在編譯過程中不會有提示,而是會在運行中導致段錯誤。 (2)一般來說,函數的輸入部分就是函數參數,輸出部分就是返回值。問題是函數的參數可以有很多個,而返回值只能有一個。則我們無法讓一個函數返回多個值。 (3)現實編程中,一個函數需要返回多個值是非常普遍的,因此完全依賴於返回值是不靠譜的,通常的做法是用參數來做返回(在典型的linux風格函數中,返回值是不用來返回結果的,而是用來返回0或者負數用來表示程序執行結果是對還是錯,是成功還是失敗)。 (4)普遍做法,編程中函數的輸入和輸出都是靠函數參數的,返回值只是用來表示函數執行的結果是對(成功)還是錯(失敗)。如果這個參數是用來做輸入的,就叫輸入型參數;如果這個參數的目的是用來做輸出的,就叫輸出型參數。輸出型參數就是用來讓函數內部把數據輸出到函數外部的。 (5)總結:函數傳參如果傳的是普通變量(不是指針)那肯定是輸入型參數;若該函數形參是指針變量並且加了const,那么就表示這個參數是用來做輸入型參數的;若該函數形參是指針變量並且還沒加const,那么就表示這個參數是用來做輸出型參數的。譬如C庫函數中strcpy函數:char *strcpy(char *dest, const char *src);。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM