可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,执行步骤如下:
- 参数列表中的省略号,代表此处可能传递数量和类型未确定的参数
- 首先在函数声明一个 va_list 类型的变量value,用于访问参数列表的未确定部分,这个变量是指向参数的指针
- 用宏 va_start 初始化定义的va_list类型的变量,宏va_start的第1个参数是 va_list 变量 value 的名字,第2个参数是省略号前最后一个有名字的参数,初始化过程把 va_list 类型的变量 value 指向可变参数部分的第1个参数
- 使用宏 va_arg 返回可变的参数,宏 va_arg 接收两个参数:va_list类型变量和参数列表中下一个参数的类型,并使 value 指向下一个可变参数。
- 访问完最后一个可变参数后,用宏 va_end 结束可变参数的获取
注:可变参数访问必须从头到尾按照顺序逐个访问
/*求n个整形参数的平均值,利用可变参数列表来实现
形参列表中必须要有一个固定值,不能只有省略号所代表的未确定参数*/
#include <stdio.h>
#include <stdarg.h>
float average(int n_values,...)
{
va_list value; //va_list类型声明
int count;
float sum=0;
float average;
/*准备访问可变参数*/
va_start(value,n_values); //初始化参数,指向第一个可变参数
/*添加取自可变参数列表的值*/
for(count=0;count<n_values;count++)
{
sum += va_arg(value,int); //取当前参数,并指向下一个参数
}
va_end(value); //完成可变参数的处理
average=((float)((int)((sum/values+0.005)*100)))/100; //取小数点后两位,四舍五入
return average;
}
#define n_values 3
int main()
{
float aver;
aver=average(n_values,9,9,8);
printf("%.2f",aver); //保留两位小数打印
return 0;
}