輸入型參數和輸出型參數

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)如果這個函數是用來做輸入的,也叫做輸入型參數,用來做輸出的

就叫做輸出型參數。

輸出型參數就是讓函數把函數內部把數據輸出到函數的外部的。

[html] view plain copy
  1. #include <stdio.h>  
  2. Int multip5_3(int a,int *p);  
  3.   
  4. int main(void)  
  5. {  
  6.    Int a,b,ret = -1;  
  7.    a3;  
  8.    Mutip5_3(a,&b);  
  9.     
  10. }  
  11. Int multip5_3(int a,int *p)  
  12. {  
  13. *p = 5 * a;  
  14. Return 0;  
  15. }  

總結:

(1)看到一個函數的原型的時候,怎麼樣看出來哪個參數做輸入或者輸出型的參數。

只能傳進去的指針,才能是輸出型參數。

(2)函數傳參如果傳的是普通的變量的話,肯定是輸入型的參數。

如果傳遞指針的話那麼就有可能是輸入也有可能是輸出型的參數。

(3)爲了區別,經常的做法是,如果這個參數是做輸入的,(通常做輸入的在函數內部只需要讀取這個參數,而不會需要更改它)就在指針前面加const來修飾。

 

如果函數形參是指針變量並且還沒有加const,那麼就表示這個參數是用來做輸出型參數。

 別人在調用你這個函數的時候,

 你寫函數的時候,和讀別人的函數的時候,有很多隱含的意義。

 舉例子:

比如我們C庫函數中,char * strcpy(char *dest,const char *src);

 

Src 是隻讀的,不需要改寫的,

 

dest就是一個輸出型的參數的實例。









轉自——家中conding123

原文地址

http://blog.csdn.net/dhauwd/article/details/77916731


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章