c语言可变参数的详细解答

1.什么是可变参数
可变参数顾名思义就是不能明确有多少个参数传入的参数,在c语言中用...表示

2.为什么需要可变参数
举个例子:如果我们要写一个两个数相加的函数时,函数参数为两个;如果我们要写三个数相加的函数时,那么函数参数需要三个;当我们要写一个任意个函数相加的函数时,那函数的参数为多少个呢?这时,可变参数就派上用场了。
还有就是c语言中的printf函数(这个就不用我多讲了)

3.可变参数的实现原理
在我们传参时,参数都是依次存放在栈中,最末尾的参数最先存放在最高地址,然后依次往低地址排(满减栈的机器),此时只要我们能知道第一个参数的地址,然后运用指针的加法原理,就能依次读出传来的参数

4.库对可变参数的封装
为了能让我们更加方便的去使用可变参数,c库特意为我们封装了一个专门用来使用可变参数的库,该函数库的头文件为#include <stdarg.h>
比较重要的几个函数如下:
       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 <stdio.h>    //标准输入输出库
#include <stdarg.h>    //可变参数函数库

//下面函数实现了一个任意数相加的函数,第一个参数为相加参数的个数
//后面可变参数为相加的个数

int sum(int num,...)
{
 va_list ap;     //存放参数的地址
 //ap = (char *)&num;  //绑定参数,实验证明,不用这个也行,系统自动绑定
 int i = 0;
 int sum = 0;
 va_start(ap, num);   //开始访问可变参数列表
 for(i=0;i<num;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\n",e);
 printf("f = %d\n",f);
 printf("g = %d\n",g);
}





    



猜你喜欢

转载自blog.csdn.net/mujun0145/article/details/80473121