可变参数列表

来源:互联网 发布:局部搜索算法历史 编辑:程序博客网 时间:2024/06/05 19:09
 一般情况下,函数只能接受固定数目的参数,而且,函数能处理的参数个数不超过五个。但有些时候,我们需要传递的参数个数不确定,或者说,参数个数大于五个,例如,求十个数的平均数,并将每个数以参数的形式传递过去,这时候,就需要用到可变参数列表。

先看一个例子:

//使用可变参数列表,通过函数实现N个数字的平均值int average(int n,...){   va_list arg;   int i=0;   int sum=0;   va_start(arg,n);   for(i=0;i<n;i++)   {      sum+=va_arg(arg,int);   }   return sum/n;   va_end(arg);}int main(){   int a=1;   int b=2;   int c=3;   int res1=average(3,a,b,c);   int res2=average(2,a,c);   printf("%d %d\n",res1,res2);   return 0;}

说明:

  • va_list 是一种数据类型,相当于宏,它在这里声明了va_list型的变量 arg,来访问参数列表的未确定部分。
  • va_start 是用来来初始化变量arg,它的第一个参数是va_list的变量 名,即arg。第二个参数是省略号前第一个有名字的参数。初始化过程是把arg变量设为指向可变参数部分的第一个参数。
  • va_arg 是用来访问各个参数的,这个宏接受两个参数,第一个是va_list变量,即arg,第二个是参数列表中下一个参数的类型。
  • va_end 是在访问完所有的可变参数时调用的。

可变参数在使用时需要注意以下几点:
1.可变参数必须从头到尾逐个访问,允许半途终止,但是不允许一开始就访问中间参数。
2.参数列表中至少有一个命名参数,若没有,va_start就不能使用。
3.这些宏是无法直接判断实际参数数量的,也无法判断每个参数的类型。
4.若在va_arg中指定的类型是错误的,那么后果不堪设想。

再来一个例子:

//利用可变参数列表求n那个数中的最大值#include <stdio.h>#include <stdarg.h>//使用前记得加头文件int max(int n, ...){    va_list arg;    int i = 0;    int max = 0;    va_start(arg, n);    for (i = 0; i < n; i++)    {        int tmp = va_arg(arg, int);        if (max < tmp)        {            max = tmp;        }    }    return max;    va_end(arg);}int main(){    int m1 = max(3, 8, 6, 9);    int m2 = max(5, 11, 68, 99, 14, 13);    printf("max1=%d max2=%d\n", m1, m2);    return 0;}