next up previous contents
Next: 變數生命週期 Up: 函式 Previous: call by reference   Contents   DYWANG_HOME

*可變參數

  1. 定義一個函式接受可變動參數數量的函式。
    int func(int, ... ) {
    ....
    }
    
    int main() {
       func(1, 2, 3);
       func(1, 2, 3, 4);
    }
    
  2. 使用方法:
    1. 必須 include stdarg.h 標頭檔;
    2. 函式參數宣告方式以逗點 , 隔開,逗點前一定是 int,表示參數個數,後接三個點 ...,表示參數。
    3. 產生 va_list type 的變數,以列出傳進函式的參數。
    4. 使用傳送函式的參數個數 int 及 va_start 巨集初始化 va_list 變數。
    5. 使用 va_arg 巨集的 va_list 變數存取傳進函式的每一個參數值。
    6. 使用 va_end 巨集清除 va_list 變數。
  3. 範例:設計一可傳入可變個數參數的 average 函式,計算傳入參數的平均值。
    [dywang@dyw219 zzz]$ vim function5.c 
    [dywang@dyw219 zzz]$ cat function5.c 
    #include <stdio.h>
    #include <stdarg.h>
    
    float average(int num,...) {
    	va_list valist;
    	float sum = 0.0;
    	int i;
    
    	va_start(valist, num);
    	for (i = 0; i < num; i++) {
    	   sum += va_arg(valist, int);
    	}
    	va_end(valist);
    
    	return sum/num;
    }
    
    main() {
    	printf("average(2,3,4)=%5.2f\n", average(2,3,4));
    	printf("average(3,3,4,5)=%5.2f\n", average(3,3,4,5));
    	printf("average(4,3,4,12,9)=%5.2f\n", average(4,3,4,12,9));
    	printf("average(5,3,4,65,11,39)=%5.2f\n", average(5,3,4,65,11,39));
    }
    
  4. 編譯成功
    [dywang@dyw219 zzz]$ gcc -o function5 function5.c
    
  5. 執行結果:傳入不同個數的整數給函式 average ,都可計算其平均。
    [dywang@dyw219 zzz]$ ./function5
    average(2,3,4)= 3.50
    average(3,3,4,5)= 4.00
    average(4,3,4,12,9)= 7.00
    average(5,3,4,65,11,39)=24.40
    



2020-01-02