可变参数列表va_list

可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,执行步骤如下:

  1. 参数列表中的省略号,代表此处可能传递数量和类型未确定的参数
  2. 首先在函数声明一个 va_list 类型的变量value,用于访问参数列表的未确定部分,这个变量是指向参数的指针
  3. 宏 va_start 初始化定义的va_list类型的变量,宏va_start的第1个参数是 va_list 变量 value 的名字,第2个参数是省略号前最后一个有名字的参数,初始化过程把 va_list 类型的变量 value 指向可变参数部分的第1个参数
  4. 使用宏 va_arg 返回可变的参数,宏 va_arg 接收两个参数:va_list类型变量和参数列表中下一个参数的类型,并使 value 指向下一个可变参数。
  5. 访问完最后一个可变参数后,用宏 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44333597/article/details/107910707