一般接触的代码参数个数为固定值,但遇到函数参数的个数不固定时,就需要用到可变参数列表的功能。
函数定义如下
*
* Variable argument list macro definitions
*/
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
函数说明如下:
1、va_list
va_list表示可变参数列表类型,实际上就是一个char指针
2、va_start
va_start用于获取函数参数列表中可变参数的首指针(获取函数可变参数列表)
* 输出参数ap(类型为va_list): 用于保存函数参数列表中可变参数的首指针(即,可变参数列表)
* 输入参数A: 为函数参数列表中最后一个固定参数
3、va_arg
va_arg用于获取当前ap所指的可变参数并将ap指针移向下一可变参数
* 输入参数ap(类型为va_list):可变参数列表,指向当前正要处理的可变参数
* 输入参数T: 正要处理的可变参数的类型
* 返回值: 当前可变参数的值.
4、va_end
va_end用于结束对可变参数的处理。实际上,va_end被定义为空.它只是为实现与va_start配对(实现代码对称和"代码自注释"功能)
总结
对可变参数列表的处理过程一般为:
1、用va_list定义一个可变参数列表
2、用va_start获取函数可变参数列表
3、用va_arg循环处理可变参数列表中的各个可变参数
4、用va_end结束对可变参数列表的处理
下面代码举例说明
//在已知参数类型和个数时,就可循环换取参数值
#include <stdio.h>
#include <stdarg.h> //必须头文件
void fun(int number,...);
int main()
{
int a = 1,b = 2,c = 3, d = 4,e = 5;
printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\n",a,b,c,d,e); //打印初值
fun(5,&a,&b,&c,&d,&e); //此处可任意调用,如fun(3,&a,&b,&c);
printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\n",a,b,c,d,e); //打印结果值
}
//使用可变参数列表【number:参数个数】
void fun(int number,...)
{
va_list list; //新建可变参数list
va_start(list,number);//获取首指针
int* temp = NULL;
for(int i = 0 ;i < number; ++i)
{
temp = va_arg(list, int*);//获取第i个值,且指针根据当前值类型后移
*temp = 0; //变更值
}
va_end(list); //结束时需要调用
}
运行结果: