可变参数列表
基本概念
可变参数列表是通过宏来实现的,这些宏定义于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\n", 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\n", max_list(5, 3, 4, 1, 2, -2)); return 0; }