详解C语言可变参数列表(stdarg头文件及其定义的宏)

文章介绍了C语言中如何使用可变参数列表,包括<stdio.h>和<stdarg.h>头文件的作用,va_list、va_start、va_arg和va_end宏的使用方法,以及一个计算任意参数平均数的示例函数。通过这些宏,程序员可以处理具有不确定数量参数的函数。
摘要由CSDN通过智能技术生成

        前言:在一些函数定义时,()内的参数并不是所有的函数参数都是唯一的,如printf函数的定义

这里的省略号就代表printf函数的参数是可以变化的,而对于一些函数其参数是固定的,如strlen

之所以有这样的不同,主要还是因为函数的作用不同,printf函数需要打印多个不同类型的数据,而strlen函数是计算字符串长度,只需要传递字符串地址即可。使用可变参数列表可以很好的解决我们的需求,而可变参数列表的实现是通过头文件<stdarg>实现的,下面就来详细介绍;

2.stdarg头文件的介绍

        基本概念:定义宏,来处理未知类型,未知参数个数的函数

         使用方法:在基本参数之后添加...来代表未知的类型,未知的参数个数

va_list  的介绍

  原型:               typedef char* va_list;

    va_list是一种指向可变参数列表的指针(注意:是指向整个可变参数列表的指针,并没有指向第一个参数,指向第一个参数需要通过va_start来实现)

        va_list arg;定义了一个数据类型为va_list的变量arg,用于进行可变参数列表的操作

va_start 的介绍

        原型:           void va_start(va_list ap, last_arg);

         具体来说:va_start的参数有两个,第一个是va_list数据类型的变量(也就是一个指向可变参数列表的指针),第二个是可变参数列表前的最近的一个参数(也就是...之前的)

        作用:初始化可变参数列表,将指针指向可变参数列表的第一个参数,使程序能够一一访问可变参数列表的每一个参数:

        va_start(arg,num);num是我自己设置的函数参数(...之前的最近的一个参数)

    

va_arg 的介绍

        

        用法:获取可变参数列表的每一个参数,并将其返回,同时将指针指向下一个参数;

        va_arg(arg,double);

va_end的介绍

        

         作用:结束对可变参数列表的访问,并释放资源

2.一个简单的例子(求任意参数的平均数)

#include <stdio.h>
#include <stdarg.h>
/*函数声明部分*/
double average(int num, ...)
{
    /*定义一个可变参数列表*/
    va_list valist;

    /*初始化可变参数列表,使其指向可变参数列表的第一个参数*/
    va_start(valist, num);

    int i = 0;
    double sum = 0.0;//用于存储总和
    for (i = 0; i < num; i++)
    {
        /*访问可变参数列表的每一个值,并将其返回*/
        sum += va_arg(valist, double);
    }

    /*清理valist所占用的内存*/
    va_end(valist);
    return sum / num;
}
int main()
{
    /*存储任意参数*/
    double a = average(10, 12.0, 23.0, 34.0, 45.0, 56.0, 76.0, 32.0, 33.0, 11.0, 90.0);
    double b = average(5, 22.3, 44.2, 14.5, 66.3, 99.5);
    printf("平均值=%.2lf\n", a);
    printf("平均值=%.2lf\n", b);
    return 0;
}

总结: 利用可变参数列表的设计程序的步骤

1.编写相应的函数,在函数参数部分添加固定参数和...来表示可变参数列表;

2.定义一个va_list类型的变量,作为可变参数列表;

3.使用va_start来初始化可变参数列表,使指针指向可变参数列表的第一个参数;

4.使用va_arg不断访问可变参数列表的每一个参数,并获得其参数,同时指向下一个参数;

5.使用va_end来清理可变参数列表的内存,释放资源;

        Tip:使用时一定要注意格式,va_list后面直接跟可变参数列表的名称即可;va_start( , )第一个参数是列表名称,第二个是函数中的固定参数(比如上述代码的num);va_arg( , )第一个参数是列表名称,第二个参数是可变参数的数据类型;va_end()参数是列表名称;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值