在C语言中常用到的printf函数就是变参数函数。
函数定义如下void printf(const char* fmt, ...) 后面的...就是可变参数。
应用变参数函数需要用到<stdarg.h>
C中变长实参头文件stdarg.h提供了一个数据类型va_list和三个宏:va_start,va_arg,va_end
→ typedef char * va_list; 用来指向上述三个宏所需数据的位置
→#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
用来使ap指向函数可变参数表中的第一个参数;v是函数参数中最后一个固定参数的标示符。
其中 #define_INTSIZEOF(n) ( (sizeof(n) +sizeof(int) - 1) & ~(sizeof(int) - 1) )
→ #define va_arg(ap,type) ( *(type *)((ap += _INTSIZEOF(type)) -_INTSIZEOF(type)) )
用来将参数转换成需要的类型,并使ap指向下一个参数
→ #defineva_end(ap) ( ap = (va_list)0 )该宏用于被调用函数完成正常返回,功能就是把指针ap赋值为0,使它不指向内存的变量
使用方法举例; 连乘函数
#include <stdarg.h>
Int multiply(int n, ...){
int i = 0;
int multi = 1;
va_list ap;
va_start(ap,n); //指向可变参数列表
for(i = 0; i <= n; i++) multi = multi *va_arg(ap, int); //取出参数,并将ap指向下一个参数
va_end(ap);
return multi;
}