在C语言的函数使用过程中要先进行函数声明,声明的内容为:
1,函数的返回类型;
2,函数的名称;
3,函数的参数;
例如下面这个简单的ADD函数:
//普通方式的ADD函数:
#include <stdio.h>
int ADD(int a,int b,int c)
{
int sum = 0;
sum = a + b;
sum = sum + c;
return sum;
}
int main()
{
int a = 2;
int b = 4;
int c = 5;
int sum = ADD(a, b, c);
printf("%d\n", sum);
return 0;
}
它的输出结果为:
上面的这个ADD函数就用三个参数((int a,int b,int c)),那么在我们的函数参数未知的情况下,我们的函数参数将声明。那么这种情况该怎么办呢?
这就要说到我们的可变参数列表了。
下面就是使用可变参数列表实现ADD函数的代码:
//可变参数列表实现ADD函数:
#include <stdio.h>
#include <stdarg.h>
int ADD(int n, ...)
{
va_list arg;
int i = 0;
int sum = 0;
va_start(arg,n);
for (i = 0; i < n; i++)
{
sum = sum + va_arg(arg, int);
}
return sum;
va_end(arg);
}
int main()
{
int a = 2;
int b = 4;
int c = 5;
int n = 3;
int sum = ADD( n, a, b, c);
printf("%d\n", sum);
return 0;
}
它的输出结果和上面代码的输出结果一致。但是它的函数参数声明((int n, ...))却与上面代码有很大的区别。
普通ADD函数参数声明:(int a,int b,int c)
可变参数列表ADD函数参数声明:(int n, ...)
这是为什么呢?想要解决这个问题,让我们来解析一下可变参数列表:
1. (int n, ...):
其中“int n”为声明函数参数的个数;“...”为参数的未确定部分;
(接下来,我们就讲如何用上面的声明方式来得到函数的参数)
2.(va_list arg;):
我们首先来看看它的定义:
它的作用就是给一个变量声明类型。
此处的变量为“arg”,所以"arg"被声明为一个"char * va_list"的变量。
3.(va_start(arg,n);):
我们来看一下它的定义:
它的作用就是初适化一个地址,并且确定单个参数的类型,以便地址进行移动访问。
此处初始化地址为“arg”,它指向的就是可变参数部分的第一个参数,单个参数类型为“int”型。
4.(va_arg(arg, int);):
我们来看一下它的定义:
它的作用就是返回当前指向的可变参数列表中的参数值,并且使自身指向下一个可变参数列表中的参数值。而它每次移动的空间大小就是由参数的类型决定的,只有这样才能每次正确读取并且跳过一个参数。
此处的参数类型为“int”型,所以每次移动4个字节。
5.(va_end(arg);):
我们来看一下它的定义:
它的作用就是使指针为空指针,停止可变参数列表的读取。
以上就是我自己对可变参数列表的分析和理解,如果有错误或没有理解到的地方欢迎大家指正和补充。在格式上有什么好的建议也欢迎提出来。