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)和上 面判断的不一样
我的讲解到此结束了,不知道有没有帮助到你们,如果有错误欢迎大家留言告知