关于c语言可变参数的用法

最近学生提出书上的一段代码比较难懂,开始没有在意,自己一看倒吓一跳,发现对于刚接触C语言的人来说,这一段代码是超级难,讲解的是关于多维数组的可变实现方式,如对于一个三维数组,
   int A[2][3][4];
上面是我们通常定义方式,但是在老严的数据结构里面却用了比较复杂的指针形式,竟然还用到了变参。晕,这对于学生来说是太难了。因此,在这整理一下关于变参的用法!

1. C语言中函数变参的调用形式:
    void foo(parm_list,...);   /*后面的参数以...代替*/

2. 编译器在对参数进行处理时,是利用栈来实现的,即参数是由右向左入栈;

3. 如何读取变参,需要三个宏:
  void   va_start(   va_list   arg_ptr,   prev_param   );        
  type   va_arg(   va_list   arg_ptr,   type   );        
  void   va_end(   va_list   arg_ptr   );    
因此需要包含头文件<stdarg.h>

4.用法:如下图示例,首先定义一个va_list的变量arg_ptr,实际上是一个指针,指向可变参数的地址。
  va_start将arg_ptr首先指向固定参数i后的第一个可变参数;va_arg则获取第一个可变参数的值,并将指针后移一个;读取完后要用va_end置为NULL。
  1. void simple_va_fun(int i,   ...)    
  2. {    
  3.     va_list   arg_ptr;    
  4.     int   j=0;    
  5.    
  6.     va_start(arg_ptr,   i);    
  7.     j=va_arg(arg_ptr,   int);    
  8.     va_end(arg_ptr);    
  9.     printf("%d   %d/n",   i,   j);    
  10.     return;    
  11. }    
注意:
1.可以多次读取参数,但是每次读取的过程同上,即首先va_start,va_arg, 最后va_end;
2.被调函数至少有一个固定参数,如int i;

调用结果如下:
  1)simple_va_fun(100);    
      结果是:100   -123456789(会变的值)    
  2)simple_va_fun(100,200);    
      结果是:100   200    
  3)simple_va_fun(100,200,300);    
      结果是:100   200  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值