可变参数

       在讲可变参数之前,我们需要了解一下参数入栈的方式。一般来说参数入栈的方式是自右向左,但也有特殊情况,不过大家记住自左向右就可以解决大多问题了。下面通过图片来分解参数是如何自左向右入栈的:

经过画图分析,大概就可以深刻理解了吧,下面我来分享一个题,请读者思考:

int main()
{
  int arr[] = {1,2,3,4,5};
  int i = 1;
  printf("%d,%d\n",arr[i],arr[i++]);//答案是?
  return 0;
}

大家一定要结合参数入栈的方式好好思考哦。

大家还记得求两个数的平均值的函数怎么写吗?三个数的平均值?四个数的平均值?n个数的平均值?

int Avg1(int a,int b)//两个数的平均值
{
  return a+b/2;
}

int Avg2(int a,int b,int c)//三个数的平均值
{
  return a+b+c/3;
}

int Avg3(int n,int a,int b,int c,int d,int e)//求1~5个数的平均值
{
  int sum = 0;
  assert(n != 0);
  if(n == 1)
    sum = a;
  else if(n == 2)
    sum = a+b;
  else if(n == 3)
    sum = a+b+c;
  else if(n == 4)
    sum = a+b+c+d;
  else if(n == 5)
    sum = a+b+c+d+e;
  else 
    sum = -1;
  return sum/n;
}

在主函数中调用函数Avg3解决两个数的平均值时,我们需要这样写:Avg3(2,10,20,0,0,0);那我们可以看到参数列表中会有3个0,这样既不好看,又容易出错,我们有没有办法求几个数的平均值就写几个参数呢,这就要用到我们今天的可变参数了:

int Avg(int n,int ...)
{
  va_list list;//游标(一个封装的指针)
  int sum = 0;
  va_start(list,n);//定位,找到"..."的开头
  for(int i=0;i<n;i++)
    {
      sum += va_arg(list,int);//取出"..."中的整形数据
    }
  va_end(list);
}

这就是一个可变参数的例子,在这个程序里边,n有两个作用,一是帮助找到“...”,二是记录“...”中省略的数据的个数。

最后揭秘一下思考题的答案:3,2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值