变长参数
1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表。
例如:void foo(par_list,....);
2.函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右到左入栈。
3.一个例子
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int max(int n,...);
int main()
{
int ret=max(4,4,3,20,6);
printf("%d\r\n",ret);
return 0;
}
int max(int n,...)
{
va_list ap;
va_start(ap,n);
int maximum=-111111;
int temp;
for(int i=0;i<n;i++)
{
temp=va_arg(ap,int);
if(maximum<temp)
maximum=temp;
}
va_end(ap);
return maximum;
}
va_list是一个宏,由va_start和va_end界定。头文件来自stdarg.h。
va_list是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
注意点:可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型。
typedef char* va_list;
void va_start(va_list ap,prev_param);
type va_arg(va_list ap,type);
void va_end(va_list ap);
上面几个函数的使用顺序:
第一步:在调用参数表之前,应该定义一个va_list类型的变量,以供以后(假设这个va_list类型变量被定义为ap)
第二步:然后对ap进行初始化,让它指向可变参数表里面的第一个参数。这个通过va_start来实现的,其第一个参数
是ap本身,第二个参数是在变参表前面紧挨着的一个变量。
第三步:然后是获取参数,调用va_arg.它的第一个参数是ap,第二个参数是要获取得参数的指定类型,并返回这个指定
类型的值,同时把ap的位置指向变量表的下一个变量位置。
第四步:获取所有参数之后,我们有必要将这个ap指针关掉,以免发生危险,方法是调用va_end。它是将输入参数ap置为NULL.

浙公网安备 33010602011771号