C語言深度學習
---輸入型參數和輸出型參數
參考朱有鵬C語言大講臺
1、函數爲什麼需要形參和返回值
(1)函數名是一個符號表示整個函數代碼段的首地址,
實質是一個指針的常量,指針常量指向這個函數
用到的函數名都是當地址用的,用來調用這個函數的。
(2)函數體是函數的關鍵,由一對{}括起來,包含很多句代碼。
函數體就是函數實際上做的工作。
(3)形參的列表和返回值
形參是函數的輸入部分,返回值是函數的輸出部分,
對函數最好的理解就是把函數理解成一個加工的機器。
把數據進行加工,得到輸出值。
程序其實就是數據的加工器。
那麼我們形參的列表就是這個機器的原材料的輸入端,
而返回值就是機器的成品輸出端。
(4)其實如果沒有形參列表,函數也能對數據進行加工,用全局變量就可以了。
在嵌入式裏面,除了你的產品佔用的結構體,其它地方最好不要用到全局變量。
因爲全局變量是非常的耗費內存的,所以我們要總是使用局部的變量。
兩種方法都有自己的優點和缺點:
A: 函數參數傳參用的比較多,因爲這樣可以實現模塊化的編程,而C語言也是
儘量減少使用全局變量。
B:Linux內核在早期審查的不是十分的嚴格,所以出現了很多全局變量。
使用的函數
C:全局變量的傳參是十分快的,參數很多情況下面對它進行打包成一個結構體。
省略了函數傳參的開銷,所以效率要高一些,但是實戰中用的最多的還是傳參,
如果參數很多傳參的開銷非常大的,通常的做法是把很多參數打包成一個結構體,
然後傳結構體變量的指針進去。
2、函數傳參的使用const指針
(1)const一般是在函數的參數的列表當中的,用法是const int *P
意義是指針變量P本身是可變的,而P指向的變量是不可變的。
(2)char *pstr = “Linux”; //存放在代碼段的
char pstr[] = "linux" ; //因爲數組是存放在數據段的
(3)const用來修飾指針做函數的參數,作用就是在於函數內部不會改變這個指針
所指向的內容,所以給該函數傳一個不可改變的指針(char *p ="linux")
不會觸發錯誤,而是一個未聲明爲const指針的函數。
總之:你看到const參數,他已經默認叫你不要去隨便的修改。
(4)函數需要向外部返回多個值的時候該怎麼辦?
PS:一開始我的想法是那你不會弄一個結構體傳出去啊?
其實傳出去的就是結構體的指針,所以你的輸出型參數在多個時候
就是要用指針傳遞
(1)一般來說,函數的輸入部分就是函數的參數,輸出部分就是返回值,
估計很多C語言初學者也會這麼認爲的。
(2)問題是如果函數的參數可以有很多個,而返回值只能有一個,這就會
讓我們無法讓一個函數返回多個值。
(3)現實編程中,一個函數需要返回多個值是非常普遍的,通常的做法
是用參數來返回。
在典型的Linux返回值是不用來返回結果的,返回值的作用
是用來返回0或者一個負數,用來表示程序執行的結果是對還是錯的。
(4)普遍的做法,編程中函數的輸入和輸出都是靠函數的參數的,返回值只是用來表示函數的執行結果
是對的還是錯。
(5)如果這個函數是用來做輸入的,也叫做輸入型參數,用來做輸出的
就叫做輸出型參數。
輸出型參數就是讓函數把函數內部把數據輸出到函數的外部的。
- #include <stdio.h>
- Int multip5_3(int a,int *p);
- int main(void)
- {
- Int a,b,ret = -1;
- a= 3;
- Mutip5_3(a,&b);
- }
- Int multip5_3(int a,int *p)
- {
- *p = 5 * a;
- Return 0;
- }
總結:
(1)看到一個函數的原型的時候,怎麼樣看出來哪個參數做輸入或者輸出型的參數。
只能傳進去的指針,才能是輸出型參數。
(2)函數傳參如果傳的是普通的變量的話,肯定是輸入型的參數。
如果傳遞指針的話那麼就有可能是輸入也有可能是輸出型的參數。
(3)爲了區別,經常的做法是,如果這個參數是做輸入的,(通常做輸入的在函數內部只需要讀取這個參數,而不會需要更改它)就在指針前面加const來修飾。
如果函數形參是指針變量並且還沒有加const,那麼就表示這個參數是用來做輸出型參數。
別人在調用你這個函數的時候,
你寫函數的時候,和讀別人的函數的時候,有很多隱含的意義。
舉例子:
比如我們C庫函數中,char * strcpy(char *dest,const char *src);
Src 是隻讀的,不需要改寫的,
dest就是一個輸出型的參數的實例。
轉自——家中conding123
原文地址
http://blog.csdn.net/dhauwd/article/details/77916731