【C语言】可变参数列表。

(1)先看一个求平均值的函数

#include <stdio.h>
double average(int val,int v1,int v2,int v3,int v4,int v5)
{
    double sum = v1;
    if(val >= 2)
        sum += v2;
    if(val >= 3)
        sum += v3;
    if(val >= 4)
        sum += v4;
    if(val >= 5)
        sum += v5;
    return sum/val;
}
int main ()
{
    printf("%f\n",average(5,1,3,5,6,7));
    return 0;
}

·当我们想要求很多值的平均数时,此函数就显得很繁琐

·在C++中,实参中参数个数可以和形参个数不一致

·在C语言中,实参中参数个数必须和形参个数一致,否则出现以下错误

(2)为了解决上面的问题,C语言给我们提供了可变参数列表

· 在函数原型中,列出了函数期望接受的参数,但是原型只能显示固定数目的参数。如果让一个函数在不同的时候接受不同数目的参数呢?

stdarg宏

· 可变参数列表可以通过宏来实现,这些宏定义在stdarg.h头文件中,它是标准库的一部分。这个头文件中声明了一个类型va_list和三个宏——va_start,va_arg,va_end。我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值。

#include <stdio.h>
#include <stdarg.h>
double average(int val, ...)
{
    int i = 0;
    va_list arg;
    double sum = 0.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,8);
    printf("%f\n", ret);
    return 0;
}

a) 上述函数中的省略号,提示此处可能传递数量和类型未确定的参数。

b) 函数声明了一个名叫var_arg的变量,它用于访问参数列表的未确定部分。这个变量通 过调用va_start来初始化。它的第1个参数是va_list变量的名字,第2个参数式省略号前最后一个有名字的参数。初始化过程把var_arg变量设置为指向可变参数部分的第1个参数。

c) 为了访问参数,需要使用va_arg,这个宏接收两个参数:va_list变量和参数列表中下一 个参数的类型。在这个例子中,所有的可变参数都是整形,在有些函数中,你可能要通过前面获得的数据来判断下一个参数的类型。va_arg返回这个参数的值,并使var_arg指向下一个可变参数。

d) 使用stdarg宏定义时,参数列表中至少要有一个命名参数。

你可能感兴趣的:(【C语言】可变参数列表。)