函数可变参数列表解析,也就是函数参数不确定

c语言中可变参数是一个 比较有意思的实现,通过将函数变为可变参数的形式,可以使得函数接受任意多个参数(不确定)

接下来先看一个例子:实现一个函数可以求任意个参数平均值

#include<stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int Average(int n, ...)
{
	int sum = 0;
	int i = 0;
	va_list arg;
	va_start(arg, n);
	for (i = 0; i < n; i++)
	{
		sum += va_arg(arg, int);
	}
	va_end(arg);
	return sum / n;
}
int main()
{
	int ret = Average(3, 1, 2, 3);
	printf("%d\n", ret);
	ret = Average(4, 1, 2, 3,10);
	printf("%d\n", ret);
 system("pause");	
return 0;
}
具体实现代码如上所示

接下来讲解


上面这张图片是对重要部分的解析

接下来一步一步分析

//因为参数是可变的,所以后面有三个...,而n代表参数总个数


//刚看到 va_list是不是很懵逼,选中va_list    按右键   转到定义,就可得到底下这一行


//如上转到定义,_ADDRESSOF(v)代表&v,   _INTSIZEOF(v)会计算参数部分v大小1-4个字节返回4,   5-8个字节返回8。如下图所示传参时先从右边传,所以表达为指向n后面一个参数地址,也就是未知参数第一个的地址,即指向1。



//第一次循环((arg+=4)-4)代表指向第二个未知参数,但是整体值还是第一个参数,也就是取出了未知第一个参数,指向第二个参数,为下一次 取出未知部分第二个参数做了铺垫。待到循环完把所有未知部分参数和求出来了


//arg 用完后不能乱指,制成空,最后求平均值

如果觉得自己掌握不是很清楚,底下还有个练习我会给出代码,大家可以对此有进一步了解

实现一个函数可以求任意个参数平均值

#include<stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int Max(int n, ...)
{
	int i = 0;
	va_list arg;
	va_start(arg, n);
	int max = 0;
	max = va_arg(arg, int);
	for (i = 1; i < n; i++)
	{
		
		int tmp = va_arg(arg, int);
		if (max < tmp)
		{
			max = tmp;
		}
	}
	va_end(arg);
	return max;
}
int main()
{
	int ret = Max(3, 1, 2, 0);
	printf("%d\n", ret);
	ret = Max(5, 1,2,3,4,8);
	printf("%d\n", ret);
 system("pause");	
return 0;
}
上面这个题注意: 1.给max赋初始值不能为0;因为可能全部是负数,0会成为最大
                                 2.if语句不能换为如下,因为va_arg(arg ,int)调用一次就会指向下一个。假如第一次进来max<va_arg(arg ,int),而max=va_arg(arg ,int)中va_arg(arg ,int)和上                                        面判断的不一样


我的讲解到此结束了,不知道有没有帮助到你们,如果有错误欢迎大家留言告知

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值