有时候,当你想要一个函数时,你可能会遇到这种情况,这个函数可以使用可变数量的参数,即参数,而不是预定义数量的参数. C编程语言为这种情况提供了解决方案,您可以根据需要定义一个可以接受可变数量参数的函数.以下示例显示了此类函数的定义.
int func(int,...){ . . . } int main(){ func(1,2,3); func(1,2,3,4); }
应该注意函数 func()将其最后一个参数作为省略号,即三个点( ... )和椭圆之前的那个总是 int ,它将表示传递的变量参数的总数.要使用此类功能,您需要使用 stdarg.h 头文件,该文件提供了实现变量参数功能的函数和宏,并遵循给定的步骤 :
定义一个函数,其最后一个参数为省略号,而省略号之前的一个函数始终为 int ,它将代表参数数量.
在函数定义中创建 va_list 类型变量.此类型在stdarg.h头文件中定义.
使用 int 参数和 va_start 宏来将 va_list 变量初始化为参数列表.宏va_start在stdarg.h头文件中定义.
使用 va_arg 宏和 va_list 变量访问参数列表中的每个项目.
使用宏 va_end 清理分配给 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 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/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)); }
编译并执行上述代码时,会产生以下结果.应该注意,函数 average()已被调用两次,并且每次第一个参数表示传递的变量参数的总数.只有省略号用于传递可变数量的参数.
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000