C语言可变参函数

 

   可变参函数(称参数个数可变函数(本文也简称变参函数),即函数参数数目可变)

C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数。这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。例如,printf,scanf函数等,不限制参数数量。
       对于每一个强制参数来说,函数头部都会显示一个适当的参数,像普通函数声明一样。参数列表的格式是强制性参数在前,后面跟着一个逗号和省略号(...),这个省略号代表可选参数。
       可变参数函数要获取可选参数时,必须通过一个类型为 va_list 的对象,它包含了参数信息。这种类型的对象也称为参数指针(argument pointer),它包含了栈中至少一个参数的位置。可以使用  这个参数指针从一个可选参数移动到下一个可选参数,由此,函数就可以获取所有的可选参数。va_list 类型被定义在头文件 stdarg.h 中。        

//宏函数
va_list:  保存所有参数->存放参数的列表
va_start: 参数的第一个位置->初始化列表
va_end:  参数的最后一个位置->释放列表
va_arg:    参数->从列表中获取数据
...    :   参数包:无参或者多个参数,参数的个数不定

例子:
int __CRTDECL printf(char const* const _Format,...);

简单案例: 求不定参数的数字的和&简单实现printf:

#include <stdio.h>
#include <stdarg.h>
//count: 有几个参数
//data: 第一个参数
//... 参数包
int Sum(int count, int data, ...) 
{
	int i, sum = data;
	va_list ap;    //保存所有参数
	va_start(ap, data);	//第一个参数的位置是data
	for (int i = 1; i < count; i++) 
	{
		sum += va_arg(ap, int);
	}
	va_end(ap);
	return sum;
}
void testSum() 
{
	printf("%d\n", Sum(3, 1, 2, 3));
	printf("%d\n", Sum(5, 1, 2, 3,4,5));
	printf("%d\n", Sum(6, 1, 2, 3,4,5,6));
}
//简单实现printf函数
void myprint(const char* str, ...) 
{
	va_list ap;
	int iNum;
	double dNum;
	va_start(ap, str);
	while (*str)
	{
		if (*str == '%') 
		{
			str++;
			switch (*str) 
			{
			case 'd':
				iNum = va_arg(ap, int);
				printf("%d", iNum);
				break;
			case 'f':
				dNum = va_arg(ap, double);
				printf("%f", dNum);
				break;
			}
		}
		else 
		{
			printf("%c", *str);
		}
		str++;
	}
}
int main() 
{
	printf("dsds\n");
	testSum();
	myprint("整数:%d小数:%f\n", 12, 1.222);
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘 关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值