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

来源:互联网 发布:linux添加uid 编辑:程序博客网 时间:2024/06/05 13:43
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;}
0 0