变长参数

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.

 

posted @ 2015-03-05 22:00  catherinexiao  阅读(245)  评论(0)    收藏  举报