首先,我们先用可变参数写俩个简单的函数
求任意个参数的平均值和最大值
#include<stdio.h>
#include<stdarg.h>
int Average(int n, ...)
{
va_list arg;
int sum = 0;
int i = 0;
va_start(arg, n);
for (i = 0; i < n; i++)
{
sum += va_arg(arg, int);
}
return sum / n;
va_end(arg);
}
int Max(int n, ...)
{
va_list arg;
va_start(arg, n);
int i = 0;
int max = va_arg(arg, int);
for (i = 0; i < n - 1;i++)
{
int ret = va_arg(arg, int);
if (ret > max)
{
max = ret;
}
}
return max;
va_end(arg);
}
int main()
{
int num = 0;
num = Average(7, 1, 2, 3, 4, 5, 6, 7);
printf("%d\n", num);
num = Max(6, 1, 2, 7, 5, 6, 8);
printf("%d\n", num);
return 0;
}
在实现可变参数函数时,我们需要引头文件#include<stdarg,h>
va_list arg; 这句代码可以理解为:char* va_list;
va_start(arg, n); 这句代码可以理解为 :(arg = (char*)&n + 4);
#define _ADDRESSOF(v) (&(v))
#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
#define va_start __crt_va_start
#define __crt_va_start(ap, x) __crt_va_start_a(ap, x)
#define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))
va_arg(arg, int);这句代码可以理解为:( *(int *) ((arg += 4) - 4);
#define va_arg __crt_va_arg
#define __crt_va_arg(ap, t) (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
va_end(arg); 这句代码可以理解为:(arg = (char*)0);
#define va_end __crt_va_end
#define __crt_va_end(ap) ((void)(ap = (va_list)0))
如有不足之处请见谅,并批评指正。

被折叠的 条评论
为什么被折叠?



