【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宏定义时,参数列表中至少要有一个命名参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值