一、为什么使用可变参数列表?
为了解决原型函数只能显示固定数目的参数的不足,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);
}