参考:https://www.cnblogs.com/yongssu/p/4677556.html
va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的
va_list用于声明一个变量,我们知道函数的可变参数列表其实就是一个字符串,所以va_list才被声明为字符型指针,这个类型用于声明一个指向参数列表的字符型指针变量,例如:va_list ap;//ap:arguement pointer
va_start(ap,v),它的第一个参数是指向可变参数字符串的变量,第二个参数是可变参数函数的第一个参数,通常用于指定可变参数列表中参数的个数。
va_arg(ap,t),它的第一个参数指向可变参数字符串的变量,第二个参数是可变参数的类型。
va_end(ap) 用于将存放可变参数字符串的变量清空(赋值为NULL)
示例:
#include <cstdarg>
double average(const int count, ...)
{
va_list ap;
//定义一个va_list类型的变量
double total = 0.0;
//定义一个浮点数保存所有的参数的和
va_start(ap, count);
//获得可变参数列表的第一个参数的地址
//第一个参数是类型为va_list的指针
//第二个参数是可变类型最左边的参数,此处是count
for (int i = 0; i < count; ++i) {
total += va_arg(ap, double);
//返回可变的参数,括号里面第二个参数是你想要返回的参数类型
}
va_end(ap); //在这里我们可以清空可变参数列表va_list
return total / count;
}
int main()
{
printf("The value of avarage is %lg\n", average(3, 7.3, 9.5, 8.5)); //结果为8.334
getchar();
return 0;
}