可变参数列表

基本概念
可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件,该文件是标准库的一部分。
这个头文件声明了一个类型va_list和三个宏:va_start,va_arg,va_end。
函数首先声明一个va_list类型的变量,它用于访问参数列表的未确定部分。这个变量通过调用va_start来初始化。
为了访问参数,需要使用va_arg,这个宏接受两个参数:va_list变量和参数列表中的下一个参数类型。va_arg返回这个参数的值,并使va_arg指向下一个可变参数。类似于指针的概念。
示例
计算指定数量的值得平均值
代码如下:
#include<stdio.h>
#include<stdarg.h>

/*
** 计算指定数量的值得平均值
*/
float average(int n_values, ...)
{
    va_list var_arg;
    float sum = 0;

    /*
    ** 准备访问可变参数
    */
    va_start(var_arg, n_values);

    /*
    ** 添加取自可变参数列表的值
    */
    for (int count = 0; count < n_values; count++)
    {
        sum += va_arg(var_arg,int);
    }

    /*
    ** 完成处理可变参数
    */
    va_end(var_arg);

    return sum / n_values;
}
int main()
{
    float avg_value = 0;
    printf("%f\n", average(4, 10, 10, 10,20));
    return 0;
}
求列表最大值
题目:编写一个名叫max_list的函数,它用于检查任意数目的整形参数并返回它们中的最大值。参数列表中必须以一个负值结尾,提示列表的结束。
代码如下:
#include<stdio.h>
#include<stdarg.h>

int max_list(int n_values,...)
{
    va_list var_max;
    int maxValue = 0;
    int  temp_value = 0;

    /*
    ** 准备访问可变参数
    */
    va_start(var_max, n_values);

    /*
    ** 获取自可变参数列表的值
    */
    while ((temp_value = va_arg(var_max, int))>0)
    {
        if (temp_value > maxValue)
        {
            maxValue = temp_value;
        }
    }
    /*
    ** 完成处理可变参数
    */
    va_end(var_max);
    return maxValue;            
}
int main()
{
    printf("最大值为%d\n", max_list(5, 3, 4, 1, 2, -2));
    return 0;
}

 

 
 
posted @ 2017-10-13 21:59  百草春生  阅读(444)  评论(0编辑  收藏  举报