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

时间:2021-07-28 17:06:39
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;
}