C语言的可变参数

代码
 1  #include  < stdio.h >
 2  #include  < stdarg.h >
 3 
 4  void  PrintFloats (  int  amount, ...)
 5  {
 6     int  i;
 7     double  val;
 8    printf ( " Floats passed:  " );
 9    va_list vl;
10    va_start(vl,amount);
11     for  (i = 0 ;i < amount;i ++ )
12    {
13      val = va_arg(vl, double );
14      printf ( " \t%.2f " ,val);
15    }
16    va_end(vl);
17    printf ( " \n " );
18  }
19 
20  int  main ()
21  {
22    PrintFloats ( 3 , 3.14159 , 2.71828 , 1.41421 );
23     return   0 ;
24  }

va_start初始化指针,va_arg读取参数,va_end将指针置0。

va_start实际上就是取得变长参数在栈中的起始地址,栈由高地址向低地址分配的特点及C语言从右向左将参数压栈的特点决定了其实现方式。

#define va_start(ap,v)   ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

v是最后一个确定的函数,通过取其地址,加上其字节对齐后的内存大小,就可以取得可变参数的首地址,详细见参考。

 

参考:

C++ : Reference : C Library : cstdarg (stdarg.h) : va_start 

va_list,va_start,va_arg,va_end——变长参数实现机制 


 

 

你可能感兴趣的:(可变参数)