C语言中可变参数是一个比较有意思的实现,通过将函数实现为可变参数的形式,可以使得函数接收1个以上的任意多个参数。我们先来举个栗子:
实现一个函数可以求任意个参数的平均值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdarg.h>
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 avg1 = average(2, a, c);//2
int avg2 = average(3, a, b, c);//2
printf("%d\n", avg1);
printf("%d\n", avg2);
system("pause");
return 0;
}
运行结果如下,没有问题。
那么在代码里,我们会看到很多不认识的东西,接下来我来一 一解析。
首先是 va_list ,我们想知道它是什么意思,选中它,右击转到定义便可以查看它的定义。
很明显我们可以看到 va_list 在定义里是 char* 的重命名,那么我们就可以说va_list 替换的是char* ,即原代码可以替换成char* arg 。这就是说我们在这里创建了一个char*类型的指针变量arg 。va_list arg-----> char* arg
所以说va_list 其实是一个类型,为了表示可变参数,与其语法统一,所以写成这样。它的本质就是char*。
接下来我们定义了一个va_start&