1.在函数原型中,列出了函数期望接受的参数,但原型只能显示固定数目的参数。让一个函数在不同的时候接受不同数目的参数是不是可以呢?
答案是肯定的,但存在一些限制。
2.这时我们就用到了可变参数列表;
(1)使用可变参数列表首先要加入如头文件#include<stdarg.h>;
它的含义有哪些呢?它声明了:
va_list 一个类型
va_start 宏//初始化变量
va_arg 宏//访问参数,并使变量指向下一个参数
va_end 宏//结束访问
我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值。
下面的程序使用三个宏正确的完成计算指定数目的值的平均值的任务。
指定数量的值的平均值
2 #include<stdarg.h>//头文件必须记得加上
3 float(int values,...)//可变参数列表,必须至少有一个命名参数
4 {
5 va_list var_arg;//声明一个va_list类型的变量,相当于char*类型的指针变量,变量名叫var_arg,用于访问参数列表的未确定部分
6 int count;
7 float sum=0;
8
9 va_start(var_arg,n_values);//变量var_arg的初始化,通过调用va_start来初始化,
//设置的过程把var_arg变量设置为指向可变参数部分的第一个参数
//宏va_start的第一个参数是变量名,第二个参数是省略号前最后一个有名字的参数
10 for(count=0;count<n_values;count+=1) //添加取自可变参数表的值
11 {
12 sum+=va_varg(var_arg,int);//使用va_arg宏访问参数;
//具体的访问为:var_arg宏接受两个参数:分别变量va_list类型的变量var_arg,和参数列表中下一个参数的类型;
//结果为va_varg返回这个参数的值,并使var_arg指向下一个可变参数。
13 }
14 va_end(var_arg); //访问完最后一个参数时,使用va_end说明
15 return sum/n_values;
16 }
1.可变参数必须从头到尾逐个访问,如果是访问了几个参数以后想终止访问,也是可以的;但是不能一开始就从参数列表中间访问;
2.由于可变参数列表的可变参数部分并没有原型,所以,所有作为可变参数传递给函数的值都会执行缺省参数类型提升;
3.通常,可变参数列表第一个参数为int型的命名参数,用于说明参数的数量,和假定了参数的类型为int型;