C语言_可变参数列表解析

     在自定义函数时,例如int fun(int a,int b)的传参都是固定个数的,那么如何自定义一个可传自定义个参数的函数呢?首先我们可以参照printf()函数的定义。
     printf(char* format,…);“…”表示参数列表未确定的部分,而列表里最少要有一个确定的参数,即可以是fun(int a,int b,…); 但不可以fun(…);
     在函数内部代码上,如何实现对不确定部分参数的访问和使用?如果能解决这个问题,那么就解决了传自定义个参数的函数的定义。
     解决这个问题,首先要理解函数的栈帧结构,理解形参在内存中如何存储。栈帧结构可以参见博主上一篇博文C语言_函数栈帧
      比如要定义一个求平均值的函数fun();可以传n个数,求这n个数的平均值。我们可以这样int fun(int n,…);f当我我们这样使用fun()函数时,fun(n,a,b,c)栈帧结构如下:
      fun(n,a,b,c)
      形参是从右往左依次压栈的,所以c在高地址,n在最下面,当我们取到n的地址和n的参数类型时,就能取到a的地址,int *p=&n,a的地址就是p+1;同理可以得到b和c的地址。
     

int fun(int n,..)
{
    int num=0;
    int *p=&n;
    int i=0;
    for(i=0;i<n;i++)
    {
    num+=*(p+i);
    }
    return num/n;
}

除了这个方法,还可以使用宏va_list,声明一个变量va_list arg,arg就用于访问可变参数列表不确定部分。首先用va_start(arg,n)初始化arg,使arg指向可变参数的第一个参数,int x1=va_arg(arg,int)把第一个参数以int类型赋值给x1,arg就会自动指向下一个参数,访问完毕之后还需要调用宏va_end(),用va_end(arg)结束。

int fun(int n,...)
 {
   int num=0;
   int i=0;
   va_list arg;
   va_start(arg,n);
   for(i=0;i<n;i++)
   {
   num+=va_arg(arg,int);
   }
   va_end(arg);
   return num/n;

   像这样使用宏的方法,同样可以实现对可变参数列表的访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值