天天看點

函數調用與函數參數

函數調用 

建立 C 函數時,會定義函數做什麼,然後通過調用函數來完成已定義的任務。

當程式調用函數時,程式控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的傳回語句被執行時,或到達函數的結束括号時,會把程式控制權交還給主程式。

調用函數時,傳遞所需參數,如果函數傳回一個值,則可以存儲傳回值。

函數參數

如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱為函數的形式參數。

形式參數就像函數内的其他局部變量,在進入函數時被建立,退出函數時被銷毀。

當調用函數時,有兩種向函數傳遞參數的方式:

調用類型 描述
傳值調用 該方法把參數的實際值複制給函數的形式參數。在這種情況下,修改函數内的形式參數不會影響實際參數。
引用調用 通過指針傳遞方式,形參為指向實參位址的指針,當對形參的指向操作時,就相當于對實參本身進行的操作。

預設情況下,C 使用傳值調用來傳遞參數。一般來說,這意味着函數内的代碼不能改變用于調用函數的實際參數。 

可變參數 

C語言程式設計中會遇到一些參數個數可變的函數,例如printf()這個函數,它的定義是這樣的:  

int printf( const char* format, ...);       

它除了有一個參數format固定以外,後面跟的參數的個數和類型是可變的,例如我們可以有以下不同的調用方法:  

printf("%d",i); 
printf("%s",s); 
printf("the number is %d ,string is:%s", i, s);       

可變參數清單是通過宏來實作的,這些宏定義在stdarg.h中,是以用到可變參數的程式應該包含這個頭檔案,它是标準庫的一部分,這個頭檔案中聲明了一個類型va_list和三個宏:va_start,va_arg和va_end: 

void va_start( va_list arg_ptr, prev_param ); //初始化一個可變參數清單
type va_arg( va_list arg_ptr, type );     //擷取下一個參數
void va_end( va_list arg_ptr );    //停止使用可變參數清單       

 例: 

#include<stdarg.h>


float average(int n_values,...)
{
    va_list var_arg;//聲明var_arg用于通路參數清單中未确定的部分
    int count;
    float sum=0;
    va_start(var_arg,n_values);//初始化var_arg,初始化過程将var_arg變量設定成指向可變參賽數部分的第1個參數。

   for(count=0;count<n_values;count+=1)
   {
       sum+=va_arg(va_arg,int);
   }          

    va_end(var_arg);

    return sum/n_values

}       

注意: