初出茅庐的小李第42博客之学习#include <stdarg.h> 头文件

stdarg.h文件是什么文件?

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。C++的cstdarg头文件中也提供这样的功能;虽然与C的头文件是兼容的,但是也有冲突存在。
可变参数函数(Variadic functions)是stdarg.h内容典型的应用,虽然也可以使用在其他由可变参数函数调用的函数(例如,vprintf)。

该如何来声明

声明可变参数函数
可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。例如printf函数一般。代表性的声明为:
int check(int a, double b, …);

可变参数函数最少要有一个命名的参数,所以
char *wrong(…);【这里省略号之前没有逗号】
在C中是不被允许的(在C++中,这样的声明是合理的)。C中,省略符号之前必须要有逗号;而在C++中,则没有这种强制要求。

  • 声明
    long func(char, double, int, …);
  • 定义
    long func(char a, double b, int c, …)
    {
    /* … */
    }

在C的旧形式中可能会出现较省略的写法

  • 声明
    long func();
  • 定义
    char a;
    double b;
    long func(a, b, c, …)
    {
    /* … */
    }

该头文件中声明了一个类型 va_list 和三个宏函数 va_start,va_arg 和 va_end

在这里插入图片描述
va_start
原型:void va_start (va_list ap, paramN);
功能:初始化一个可变参数列表
参数:第一个参数 ap 接受一个 va_list 变量,第二个参数 paramN 接受函数传入参数中的可变参数前的最后一个有名字的参数。

va_arg
原型:type va_arg (va_list ap, type);
功能:获取可变参数列表中的下一个参数
参数:第一个参数 ap 是 va_list 变量,第二个参数 type 指明下一个参数的类型。

va_end
原型:void va_end (va_list ap);
功能:结束使用可变参数列表
参数:ap 结束一个结束访问的 va_list 变量。

va_copy
原型:void va_copy (va_list dest, va_list src);
功能:产生一个可变参数列表的副本
参数:第一个参数 dest 为目标可变参数列表,第二个参数 src 是源可变参数列表。(后面的复制到前面的)

网上收集的一个代码示例

#include <stdio.h>
#include <stdarg.h>

double average(int n,...)
{
    double sum1 = 0;
	double sum2 = 0;
    va_list args;         // 声明一个 va_list 类型的变量 args
    va_list Val2;
    va_start(args, n);    // 通过调用 va_start 来初始化这个 args
    va_copy(Val2, args);  // 复制操作
    for(int i = 0; i < n; i++)
	{
        sum1 += va_arg(args, int); // 通过调用 va_arg 获取下一个参数
    }
	for(int i = 0; i < n; i++)
	{
        sum2 += va_arg(Val2, int); // 通过调用 va_arg 获取下一个参数
    }
    va_end(args); // 释放 va_list 变量
	va_end(Val2); // 释放 va_list 变量
	printf("%.2lf\n",sum2);
    return sum1 / n;
}

int main()
{
    printf("%.2lf", average(10,1,2,3,4,5,6,7,8,9,10));
    return 0;
}

运行结果分析

在这里插入图片描述
它可以计算变参数的平均值,当然也可以用到其他方面。比如用在串口打印数据上,就可以实现类似标准库的printf功能,我也是看见有这样的写反才来学习一下该标准头文件,研究明白了再来记录吧

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值