前言:本篇文章介绍了C语言中的可变参数列表。C语言中的可变参数可以通过将函数实现为可以改变参数的形式,可以使得函数可以接受1个以上的任意个参数。如果本篇文章那里有错误的地方,欢迎指出。
stdarg宏
可变参数列表是通过宏来实现的,这些宏定义于头文件
stdarg.h
中。这个头文件声明了一个类型va_list、va_start、va_arg、va_end
。可以声明一个类型为va_list
的变量,与va_list、va_start、va_arg、va_end
这几个宏配合使用,访问参数的值。
下边我们先到定义处看一下va_list、va_start、va_arg、va_end
这几个宏的定义
以下面例子说明可变参数列表
实现一个函数求任意多个参数的平均值,代码如下
#include<stdio.h>
#include<stdarg.h>
int average(int n, ...)
{
va_list arg;
int i = 0;
int sum = 0;
va_start(arg, n);
for (i = 0; i < n; i++)
{
sum += va_arg(arg, int);
}
return sum / n;
va_end(arg);
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int avg1 = average(2, a, b);
int avg2 = average(3, a, b, c);
printf("avg1=%d", avg1);
printf("avg2=%d", avg2);
return 0;
}
对average函数进行分析
- 声明一个
va_list
类型的变量,用于访问参数列表的未确定部分 va_start
用来初始化arg
的,将arg
指向可变参数部分的第一个参数va_arg
接受两个参数:arg
和参数列表下一个参数的类型。va_vag
返回第一个参数的值并使arg
指向下一个可变参数- 访问完最后一个可变参数后,调用
va_end
,使arg
为空指针
扩展:
实现一个函数求任意多个参数的最大值
#include<stdio.h>
#include<stdarg.h>
#include<windows.h>
int Max(int n, ...)
{
va_list arg;
int i = 0;
va_start(arg, n);
int max = va_arg(arg, int);
//令max等于可变列表的第一个参数,并且arg已经指向了下一个参数
for (i = 1; i < n; i++)
{
int temp = va_arg(arg, int);
//令max等于可变列表的第二个参数,这里很重要,如果不这样做,下边将会和第三个参数比较,跳过了第二个参数
if (temp>max)
{
max = temp;
}
}
return max;
va_end(arg);
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int Max1 = Max(2, a, b);
int Max2 = Max(3, a, b, c);
printf("Max1=%d\n", Max1);
printf("Max2=%d\n", Max2);
system("pause");
return 0;
}
可变参数的限制
- 可变参数必须从头到尾逐个访问,不能一开始就访问中间参数。
- 参数列表至少有一个命名参数,目的是使用
va_start
找到可变参数列表的第一个参数。 - 如果没有命名参数,这些宏无法直接判断实际存在参数个数。
- 如果没有命名参数,这些宏无法直接判断每个参数的类型。
- 如果在
va_arg
中指定错误类型,将会的到错误的结果。