下午在看《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)等