可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中,是标准库一部分,这个头文件声明一个类型va_list和三个宏va_start,va_arg和va_end

声明va_list 类型变量arg,用于访问参数列表未确定部分,用va_start来初始化,它的第一个参数是va_list的变量名,第二个是省略号前最后一个有名字的参数。初始化吧arg变量设置为指向可变参数部分的第一个参数

va_arg,接受两个参数,va_list变量和参数列表中下一个参数的类型。返还参数值并指向下一个可变参数

va_end访问完最后一个可变参数后调用


//求平均值
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>

int my_average(int count, ...)
{
	va_list arg;//char*类型
	int sum = 0;
	va_start(arg, count);
	int i = 0;
	for (i = 0; i < count; i++)
	{
		sum += va_arg(arg, int);//向后获取一个×××变量
	}
	va_end(arg);
	return sum / count;
}
int main()
{
	int avg = my_average(3, 7, 2, 3);
	printf("%d\n", avg);

	system("pause");
	return 0;
}

例二

//求最大值
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>

int my_max(int n, ...)
{
	va_list arg;
	va_start(arg, n);

	int max = 0;
	int i=0;

	max = va_arg(arg, int);


	for (i = 1; i < n; i++)
	{
		int tmp = va_arg(arg, int);
		if (max < tmp)
		{
			max = tmp;
		}
	}
	va_end(arg);
	return max;
}
int main()
{
	int ret = my_max(3, 2, -4, 1);
	printf("%d", ret);
	system("pause");
	return 0;
}