用过printf()函数的热都知道,printf的参数可以有多个,它是可变的,根据我们输出参数的类型以及个数的不同来确定参数。今天来学习C语言中参数可变的函数是如何实现的。
1 可变参数
首先我们要明白一点,在C语言中,参数可变的函数的实现,要依赖于头文件stdarg.h。所以在实现这样的函数的时候,需要包含该头文件。
其次,实现函数可变参数需要使用以下几个类型参数,我们需要熟练掌握它们的使用,下面先看看这些参数是什么?
- va_list:参数集合
- va_arg:取具体参数值
- va_start:标识参数访问的开始
- va_end:标识参数访问的结束
看了上面的参数的意义,还是不知道什么是什么。下面看一个例子,就能彻底明白了。
下面函数的意思是求n个数的平均值。这n个数直接作为参数传递给函数(这么写肯定是效率不高,这里只是为了学习使用)
- 45-2.c
#include <stdio.h>
#include <stdarg.h>
float average(int n, ...){ //这个n代表参数的个数,后面的...代表后面的参数不确定是什么
va_list args; // args代表函数可变参数的集合
int i = 0;
float sum = 0;
va_start(args, n); // 如果要遍历args参数的话,则从args参数集合的开始,遍历n次结束
for(i=0; i<n; i++){
sum+=va_arg(args, int); // 开始遍历,取具体参数值,类型为int
}
va_end(args); // 代表参数集合args访问结束
return sum/n;
}
int main(){
printf("%f\n", average(5,1,2,3,4,5));
printf("%f\n", average(4,1,2,3,4));
return 0;
}
- 上述代码编译运行结果为:
上面代码不难,主要是学会使用那几个参数的使用。我们需要注意以下几点:
- 可变参数必须从头到尾按照顺序逐个访问
- 参数列表中,至少要存在一个确定的命名参数
- 可变参数函数无法确定实际的参数的数量,需要在运行的时候根据具体的传参结果来计算
- 可变参数函数,无法确定参数的实际类型
注意:如果va_arg中指定的参数的类型与实际的不匹配,那么最终的计算结果将是不可预测的。
2 总结
- 学会定义可变参数的函数。主要是使用方法。