C语言可变参数的理解

在C语言中通过引用头文件#include<stdarg.h>可以实现可变参数的程序

求n个数的平均值函数:

#include<stdio.h>
#include<stdarg.h>
int average(int n, ...)
{
	va_list arg;//char *arg;
	int i = 0;
	int sum = 0;
	va_start(arg, n);//(arg=(char *)&n+4);
	for (i = 0; i < n; i++)
	{
		sum += va_arg(arg,int);//sum+=(*(int*)((arg += 4) - 4))两步操作将n后面第一个参数赋值给sum这时arg已经指向后面一个参数
		//    #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
	}
	va_end(arg);//   #define __crt_va_end(ap)        ((void)(arg = (char *)0))
	return sum / n;
}
int main()
{
	int ave = average(3,4,5,6);
	printf("%d\n",ave);
	int aver = average(4, 6, 7, 8, 9);
	printf("%d", aver);
	system("pause");
	return 0;
}

其中va_list arg相当于定义一个指针。

va_start(arg, n)使指针指向已知变量n后面的一个变量。

sum += va_arg(arg,int):sum+=(*(int*)((arg += 4) - 4))两步操作将n后面第一个参数赋值给sum这时arg已经指向后面一个参数

va_end(arg);:使开始定义的指针为空。

同理求n个数的最大值:

#include<stdio.h>
#include<stdarg.h>
int MAX(int n, ...)
{
	va_list arg;
	int tmp = 0;
	int max = 0;
	int i = 0;
	va_start(arg, n);
	for (i = 0; i < n; i++)
	{
		tmp = va_arg(arg, int);
		if (tmp> max)
			max = tmp;
	}
	va_end(arg);
	return max;
}

int main()
{
	int max = MAX(3,4,5,6);
	printf("%d",max);
	system("pause");
	return 0;

}


猜你喜欢

转载自blog.csdn.net/CHR_1s/article/details/79982567