C - 变量参数

有时候,当你想要一个函数时,你可能会遇到这种情况,这个函数可以使用可变数量的参数,即参数,而不是预定义数量的参数. 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