有时,希望函数带有可变数量的参数,而不是预定义的数量的参数。C语言提供了一个解决方案,它允许定义一个函数,能够根据具体的需求接收可变数量的参数,例如:
int fun(int, ...){
...
}
int main(){
fun(2,2,3);
fun(1,2,3,4);
}
说明:
函数fun()最后的一个参数写成省略号,就是(…),省略号之前的那个参数是int,代表了传递的可变参数的总数。为了使用这个功能,需要使用stdarg.h头文件,该文件是提供实现可变参数的函数和宏。步骤如下:
- 定义一个函数,最后的一个参数为省略号,省略号前面可以设置成为自定义的参数。
- 在函数定义中创建一个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;
//为num个参数初始化valist
va_start(valist, num);
//访问所有赋值给valist的参数
for(i = 0;i < num; i++){
sum += va_arg(valist, int);
}
//清理为valist保留的内存
va_end(valist);
return sum/num;
}
int main(){
printf("Average of 2,3,4,5 = %f\n",average(4,2,3,4,5));
printf("Average of 5,10,15 = %f\n",average(3,5,10,15));
}
输出结果如下,应该注意的是,函数average()被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。
Average of 2,3,4,5 = 3.500000
Average of 5,10,15 = 10.000000
参考:http://www.runoob.com/cprogramming/c-variable-arguments.html