基本概念
可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件,该文件是标准库的一部分。
这个头文件声明了一个类型va_list和三个宏:va_start,va_arg,va_end。
函数首先声明一个va_list类型的变量,它用于访问参数列表的未确定部分。这个变量通过调用va_start来初始化。
为了访问参数,需要使用va_arg,这个宏接受两个参数:va_list变量和参数列表中的下一个参数类型。va_arg返回这个参数的值,并使va_arg指向下一个可变参数。类似于指针的概念。
示例
计算指定数量的值得平均值
代码如下:
#include<stdio.h>
#include<stdarg.h>
/*
** 计算指定数量的值得平均值
*/
float average(int n_values, ...)
{
va_list var_arg;
float sum = 0;
/*
** 准备访问可变参数
*/
va_start(var_arg, n_values);
/*
** 添加取自可变参数列表的值
*/
for (int count = 0; count < n_values; count++)
{
sum += va_arg(var_arg,int);
}
/*
** 完成处理可变参数
*/
va_end(var_arg);
return sum / n_values;
}
int main()
{
float avg_value = 0;
printf("%f
", average(4, 10, 10, 10,20));
return 0;
}
求列表最大值
题目:编写一个名叫max_list的函数,它用于检查任意数目的整形参数并返回它们中的最大值。参数列表中必须以一个负值结尾,提示列表的结束。
代码如下:
#include<stdio.h>
#include<stdarg.h>
int max_list(int n_values,...)
{
va_list var_max;
int maxValue = 0;
int temp_value = 0;
/*
** 准备访问可变参数
*/
va_start(var_max, n_values);
/*
** 获取自可变参数列表的值
*/
while ((temp_value = va_arg(var_max, int))>0)
{
if (temp_value > maxValue)
{
maxValue = temp_value;
}
}
/*
** 完成处理可变参数
*/
va_end(var_max);
return maxValue;
}
int main()
{
printf("最大值为%d
", max_list(5, 3, 4, 1, 2, -2));
return 0;
}