有时候可能会遇到这样的情况,当想有一个函数,它可以利用可变数量的参数,即参数,而不是参数预设的个数。 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 ", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f ", average(3, 5,10,15)); }
当上述代码被编译和执行时,它产生了以下结果。应当指出的是,函数average() 被调用两次,并在每次第一个参数表示被传递的可变参数的总数。只有椭圆将被用来传递可变数量的参数。
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000