C语言中可变参数函数

下午在看《Windows程序设计》,第二章里最后提供了一个程序各种看不懂,百度一下午后学习了关于可变参数函数的知识...也算是有了收获


先来说说什么是可变参数函数吧,可变参数函数,顾名思义,就是参数个数可变的函数(噗...),比如我们常用的printf(), 我们可以printf("%d" , n1) 也可以printf("%d %d" , n1 , n2)等,参数是可变的。

来看下printf()的原型

int printf(const char * format, ...);

后面的三个点"..."就代表了参数个数是可变的。


那么怎么使用可变参数呢,下面我用一个程序来举个例子,程序是用来求任意个数的自然数的平方和


#include <stdarg.h>
#include <stdio.h>
int fun(int n1,...){
	va_list arg_ptr;
	int sum = 0 , n = n1;
	va_start(arg_ptr , n1);
	while(n > 0){
		sum += n * n;
		n = va_arg(arg_ptr , int);
	}
	va_end(arg_ptr);
	return sum;
}

int main()
{
	printf("%d\n" , fun(2 , 3 , 4 , 5 , -1));
	return 0;
}

现在来分析一下这个程序

fun()就是用来求和的函数,从原型我们可以看出,fun()是一个可变参数函数

首先,va_list arg_ptr;

这个语句是定义一个指向可变参数列表的指针。可变参数列表不同于固定参数列表。固定参数列表就是参数int n1那里,是事先指定的,可变参数列表就代表了后面的...。

然后,va_start(arg_prt , n1);

va_start()函数是将指向可参数列表的指针指向可变参数列表的第一个参数。第一个参数arg_prt就是指向可变参数列表的指针,第二个参数指的是最后一个固定参数,这里就是n1,如果函数原型时int fun(int n1, int n2,...)那么这里的参数就应该是n2

再来,va_arg(arg_ptr , int);

va_arg()函数是返回arg_ptr指向的参数的值, int指定返回的类型,然后使指针指向下一个可选参数

最后va_end(arg_ptr);

清空参数列表,使arg_ptr无效化

va_list,  va_start() , va_arg() , va_end()等都定义在头文件stdarg.h中

这样上面这个程序就很清楚了,首先我们定义一个指向可变参数列表的指针arg_ptr,然后通过va_start()使指针指向第一个可选参数,然后进入循环求解平方和,va_arg()函数取出当前的指针指向的参数,并修改指针指向下一个可选参数。如果取出的n<0结束循环,最后用va_end()清空列表,无效指针,返回结果。

函数调用就可以fun(2 , 1,  -1) , fun(2, 5 , 1,  ,3 , -2)等


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值