1.什么是可变参数
可变参数顾名思义就是不能明确有多少个参数传入的参数,在c语言中用...表示2.为什么需要可变参数
举个例子:如果我们要写一个两个数相加的函数时,函数参数为两个;如果我们要写三个数相加的函数时,那么函数参数需要三个;当我们要写一个任意个函数相加的函数时,那函数的参数为多少个呢?这时,可变参数就派上用场了。
还有就是c语言中的printf函数(这个就不用我多讲了)3.可变参数的实现原理
在我们传参时,参数都是依次存放在栈中,最末尾的参数最先存放在最高地址,然后依次往低地址排(满减栈的机器),此时只要我们能知道第一个参数的地址,然后运用指针的加法原理,就能依次读出传来的参数4.库对可变参数的封装
为了能让我们更加方便的去使用可变参数,c库特意为我们封装了一个专门用来使用可变参数的库,该函数库的头文件为#include
比较重要的几个函数如下:
void va_start(va_list ap, last); //访问可变参数列表的函数
type va_arg(va_list ap, type); //读取可变参数的函数
void va_end(va_list ap); //结束访问可变参数列表的函数
void va_copy(va_list dest, va_list src);
详细用法看下面例子。5.使用例子:
#include //标准输入输出库
#include //可变参数函数库//下面函数实现了一个任意数相加的函数,第一个参数为相加参数的个数
//后面可变参数为相加的个数int sum(int num,...)
{
va_list ap; //存放参数的地址
//ap = (char *)# //绑定参数,实验证明,不用这个也行,系统自动绑定
int i = 0;
int sum = 0;
va_start(ap, num); //开始访问可变参数列表
for(i=0;i {
sum+=va_arg(ap,int);//对可变参数进行相加,实验证明,每读取完一个 //参数后,ap会自动指向下一个参数
}
return sum;
}int main()
{
int a = 5;
int b = 10;
int c = 15;
int d = 20;
int e = 0;
int f = 0;
int g = 0;
e = sum(2,a,b);
f = sum(3,a,b,c);
g = sum(4,a,b,c,d);
printf("e = %d
",e);
printf("f = %d
",f);
printf("g = %d
",g);
}