C语言中可变参数函数实现

C99版本加入可变参数列表概念。用于实现函数参数的变长传递。

#include<stdarg.h>中定义了相关方法。
typedef struct
{
    char *ao; //起始地址
    int offset;//相对偏移量
}va_list;

控制函数: 
 void va_start( va_list arg_ptr, prev_param ); //创建
 type va_arg( va_list arg_ptr, type ); //获取相应的参数
 void va_end( va_list arg_ptr );//释放 
 void va_copy(va_list dest,va_list src);

 //variable - argument(可变参数)

说明:
1.首先,定义一个va_list类型变量,用va_start( )函数实现对arg_ptr进行初始化。初始化完成后,arg_ptr指向可变参数表中的第一个参数。va_start( )函数第二个参数是“…”之前的那个参数。

2.调用va_arg函数,第一个参数是arg_ptr,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把arg_ptr的位置指向列表的下一个变量位置。

3.获取了所有的参数后要关闭arg_ptr,调用va_end函数即可。它是把输入的参数 arg_ptr 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。

例:实现多个整数的求和运算
#include <stdio.h>
#include <stdarg.h>

float avg(int n,...)
{
    va_list args;  //定义指向可变参数列表的指针
    int i;
    float ret = 0.0;

    va_start(args,n); //  args指向可变参数列表的第一个参数    n是可变参数列表个数

    for(i = 0; i < n; i++)
    {
        ret += va_arg(args,int);   //把arg_ptr指向的值返回
                                   //并把arg_ptr的位置指向列表的下一个变量位置。   
    }

    va_end(args);

    return ret / n;
}   

int main()
{
    printf("%f\n",avg(5,1,2,3,4,5));
    printf("%f\n",avg(4,1,2,3,4));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值