可变参数列表的实现--平均值
c语言中用可变参数列表的原因:
cpp文件中参数可以初始化,则实参中用几个参数写几个,但是c中形参不可以初始化,所以引出可变参数列表,头文件为stdarg.h,使用宏stdarg
va_list类型 arg声明的变量名 eg:va_list arg //访问参数列表未确定部分
宏stdarg使用了三种宏 :
va_start(arg,val)初始化 //将arg_ptr设置为传递给该函数参数列表的第一个可选参数,\val已确定参数列表最后一个参数
va_arg(arg,int)读取 //arg_ptr给出的位置检索type的值,并将arg_ptr指向列表\
中的下一个参数,使用type的范围确定下一个参数的类型。int是下一个参数的类型
va_end(arg)结束 //重置指向NULL的指针
<span style="font-size:18px;">#include<stdio.h>
#include<stdarg.h>
double average(int val,...)
{
va_list arg;
double sum=0.0;
int i=0;
va_start(arg,val);
for(i=0;i<val;i++)
{
sum+=va_arg(arg,int);
}
va_end(arg);
return sum/val;
}
int main()
{
double ret=average(6,1,2,3,4,5,7);
printf("%f\n",ret);
return 0;
}</span>
测试结果如下图:ret = (1+2+3+4+5+7)/6
说起可变参数列表我们可以想到printf函数:
如下是函数printf的实现:
#include <stdio.h>
#include<stdarg.h>
int printf(char* format, ...)
{
va_list arg;
va_start(arg, format);
int n;
n = vprintf(format, arg);
va_end(arg);
fprintf(stdout, "\n");
return n;
}
int main()
{
char* aaa = "hello world!";
printf(aaa);
return 0;
}