可变参数列表解析
举个例子:实现一个函数可以求任意个参数的平均值
```python
#include <stdio.h>
#include <windows.h>
#include <stdarg.h>
int average(int n,...)
{
va_list arg;//可以理解成字符指针char * 用于访问参数列表中未确定的部分
int i=0;
int sum=0;
va_start(arg,n);//这里将上面得到的字符指针后移4个字节,指向n的内存地址。
for(i=0;i<n;i++)
{
sum += av_arg( arg ,int);//av_arg( arg , int)是将arg向后跳过4个字节(sizeof(int)大小)指向下一个参数,返回的是当前的参数而非下一个参数
}
return sum/n;
av_end(arg);//结束标志
}
int main()
{
int a=10;
int b=20;
int c=30;
int d=40;
int ave1=average(2,a,b);
int ave2=average(3,a,b,c);
int ave3=average(4,a,b,c,d);
printf("%d
",ave1);
printf("%d
",ave2);
printf("%d
",ave3) ;
system("pause");
return 0;
}
输出结果:
15
20
25
```
可变参数的限制
注意:
- 可变参数必须从头到尾逐个访问,中途停止是可以的,但不可以一开始就访问参数列表中间的从参数。
- 参数列表中至少有一个命名参数。如果一个都没有的话,va_start是无法使用的。
- 这些宏是无法直接判断实际存在的参数的数量。
- 这些宏无法判断每个参数的类型。