也许某些时候, 你遇到这种情况,希望设计一个函数,可以接受的参数个数
是变化的,就是说它的参数个数,不是预先定义好的, C语言提供了一种方案
可以实现一个函数,接受可变参数。
下面例子,展现一个这样的例子:
int fun(int, ...){
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
注意,func 最后一个参数是省略号,就是 (...) , 省略号前面,必须是一个int ,
用来表示传入参数的个数。如果你想使用这个功能,需要include stdarg.h 这个
头文件,并按如下规则去做:
- 定义一个函数,它的最后一个参数是省略号,并且省略号之前的参数是int, 用以表示参数的个数。
- 创建 va_list 类型的变量
- 使用int 参数 各va_start 去初始化参数列表
- 使用va_arg 和va_list 去访问参数列表中的每一个参数。
- 使用va_end 去free 掉va_list 所占用的内存
#include <stdio.h>
#include <stdarg.h>
double average(int num,...){
va_list valist;
double sum = 0.0;
int i;
/* initialize valist for num number of arguments */
va_start(valist, num);
/* access all the argument assigned to valist */
for (i = 0; i < num; i++){
sum += va_arg(valist, int);
}
/* clean memory reserved for valist */
va_end(valist);
return sum/num;
}
int main(){
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
printf("Average of 5, 10, 15, = %f\n", average(3, 5, 10, 15));
}
int
SetMemm (int num, ... )
{
va_list valist;
int sum = 0;
int i;
/* initialize valist for num number of arguments */
VA_START(valist, num);
/* access all the arguments assigned to valist */
for (i = 0; i < num; i++) {
sum += VA_ARG(valist, int);
}
/* clean memory reserved for valist */
VA_END(valist);
return sum;
// return InternalMemSetMem (Buffer, Length, Value);
}