一、爲什麼使用可變參數列表?
爲了解決原型函數只能顯示固定數目的參數的不足,C語言定義了一種訪問數目未定的參數列表的機制,這就是可變參數列表。
二、如何使用?
“聲明 開始 使用 結束”三步完成。
type fun(list_num,...)
{
va_list vlist;//不定參數聲明
va_start(vlist,vlist_num);//指明參數個數
va_arg(vlist,type);//使參數偏移sizeof(type)字節
va_end(vlist);//結束訪問
}
三、缺點
- 無法判斷不定參數的個數(需另外傳參)
- 無法使用隱式轉換(都當成是int)
第一點導致我們需要對參數個數進行另外指定(如下例中的 n_values);第二點導致必須確保傳入參數類型可靠性(不使用隱式轉換規則情況下)
四、一個例子:求平均值
#include <stdio.h>
#include <stdarg.h>
double fun(int n_values, ...)
{
va_list vlist;//... uncertain parameter
int count = 0;
double sum = 0;
va_start(vlist, n_values);//start
for (; count < n_values; count++)
{
sum += va_arg(vlist, double);//use,輸入需要保證“...”部分是double,即不可以發生隱式轉換
}
va_end(vlist);//end
return sum / n_values;
}
int main()
{
double result = fun(10, 1.0, 2.00, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
printf("result = %lf", result);
}