可变参数:即可以改变参数列表可以使函数接受一个以上的任意多的参数
一般来说我们在定义并使用一个函数的时候,它的参数的个数是确定好的,而可变参数呢就是针对于一些参数数量改变的函数,例如我们呢在计算一堆数据的平均值的时候我们可以就算出这些参数的总体数量之后就可以使用可变参数来实现~
首先我们要知道可变参数的定义方法或者说是格式
int Add(int n,...)//n代表可变参数部分的个数,...代表可变参数的部分
光说不练假把式我们来写一下这个函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdarg.h>
int Add(int n, ...)
{
va_list arg;//访问参数列表未确定的部分arg是一个指针变量
int i;
int sum = 0;
va_start(arg, n);//初始化,将arg指向可变参数的第一个
for (i = 0; i < n; i++)
{
sum += va_arg(arg,int);//arg与可变参数的类型
}
return sum / n;
va_end(arg);//访问完可变参数后结束标志
}
int main()
{
int n = 2;
int a = 10;
int b = 20;
int ret = Add(2, a, b);
printf("%d", ret);
system("pause");
return 0;
}
结果就不截屏了很明显绝对是15~
然后我们来看一下这个代码里的 va_list ,va_start , va_end这些乱七八糟的东西:
首先va_list 它呢是一个c语言定义出来的一个类型,原型是这个样子滴
typedef char* va_list
很明显va_list是一个字符串指针 ,指向可变参数部分的指针这样我们在访问指针的时候就可以直接用指针++来访问了就比较方便,所以arg就是一个指针
然后我们来看va_start,va_arg,va_end
显而易见这三个都是宏,arg这个变量是调用va_start这个宏来初始化的,将arg指向可变参数部分的第一个参数
而va_arg则是访问参数的一个宏,它接受两个参数一个是va_list的变量,另一个则是下一个访问参数的类型,这个代码中我们的参数都是int的,然后将这个指针指向的参数的值返回并且将指针指向下一个参数。我们就可以写一个for循环这样就可以访问到可变参数部分的每一个参数然后我们对这些参数进行各种运算就很简单了
最后在访问完最后一个参数之后我们要使用 va_end将这个指针指向NULL防止这个指针变成野指针。