C語言可變參數
有時候可能會遇到這樣的情況,當想有一個函數,它可以利用可變數量的參數,即參數,而不是參數預設的個數。 C語言編程語言提供了這種情況的解決方案,並允許定義可以接受根據需要的可變數量參數的函數。下麵的例子示出了這樣一個函數的定義。
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
應該注意的是,函數func()有最後一個參數為橢圓即三個點(...)和一個之前的橢圓始終表示通過總數量可變參數的int類型。要使用這些功能,需要使用stdarg.h頭文件,它提供的功能和宏來實現的可變參數的功能,並按照下列步驟:
-
定義一個具有最後一個參數為橢圓形和一個之前的橢圓始終將代表數量的參數為int的函數。
-
創建函數定義一個va_list的類型變量。這種類型在stdarg.h 頭文件中定義。
-
使用int參數,宏va_start到va_list變量初始化為一個參數列表。宏va_start在stdarg.h頭文件中定義。
-
使用va_arg宏和va_list變量來訪問參數列表中的每個項目。
-
使用宏va_end用來清理分配到va_list變量的存儲器。
現在就讓我們按照上麵的步驟,並寫下了一個簡單函數,可采取可變數量的參數,並返回它們的平均值:
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /* initialize valist for num number of arguments */ va_start(valist, num); /* access all the arguments assigned to valist */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* clean memory reserved for valist */ va_end(valist); return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %f ", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f ", average(3, 5,10,15)); }
當上述代碼被編譯和執行時,它產生了以下結果。應當指出的是,函數average() 被調用兩次,並在每次第一個參數表示被傳遞的可變參數的總數。隻有橢圓將被用來傳遞可變數量的參數。
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000