可变参数函数顾名思义,就是函数参数个数是未知的是可变的。
(1)可变参数列表是通过宏来实现的,这些宏定义在stdarg.h 这个头文件中,这个头文件声明了一个类型va_list和三个宏——va_start , va_arg, va_end.
(2)比如定义一个可变参数函数
void print(char *fomt, ...)
va_list:声明一个变量//va_list arg;
va_start:初始化va_list声明的这个变量,它的第一个参数是va_list声明的变量另外一个参数是省略号前最后一个有名字的参数
//va_start(arg,fomt);
初始化过程就是把参数列表的第一个参数给va_list声明的这个变量。
va_arg:我们就是通过这个来访问未知参数的,va_arg的一个参数是va_list声明的这个变量,另一个参数列表中下一个要接收的参数类型//va_arg(arg,char);
va_end:释放空间
1.一个函数可以求任意多个数的平均值(使用可变参数列表)
#include<stdio.h>
#include <stdarg.h>
int average(int num, ...)
{
va_list arg; //定义一个va_list类型的变量,用于访问参数列表的未确定部分
va_start(arg, num);
int sum = 0;
for (int i = 0; i < num; i++){
sum += va_arg(arg, int);
}
va_end(arg);
return sum / num;
}
int main()
{
int a = 1;
int b = 3;
int aver1 = average(3, 2, 3, a);
int aver2 = average(4, 5, a, b, 8);
printf("aver1 = %d\n", aver1);
printf("aver2 = %d\n", aver2);
system("pause");
return 0;
}
2.使用可变参数,实现函数,求函数参数的最大值。
#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
int isMax(int n, ...)
{
int max = 0;
va_list arg;
va_start(arg, n);
for (int i = 0; i < n; i++){
int val = va_arg(arg, int);
if (val > max){
max = val;
}
}
va_end(arg);
return max;
}
int main()
{
int ret = isMax(5, 1, 2, 3, 4, 5);
printf("%d\n", ret);
system("pause");
return 0;
}
3..模拟实现printf函数,可完成下面的功能
//能完成下面函数的调用。
//print("s ccccc d \n", "hello", 'w', 'o', 'r', 'l', 'd', 100);
//函数原型:
//print(char *tmp, ...)
//能完成下面函数的调用。
//print("s ccccc d \n", "hello", 'w', 'o', 'r', 'l', 'd', 100);
//函数原型:
//print(char *tmp, ...)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windows.h>
void print(char *tmp, ...) //实现可变形参
{
va_list arg; //声明va_list类型的变量arg,用于访问参数列表的未确定部分
va_start(arg, tmp); //调用va_start来初始化。初始化过程把arg变量设置为指向可变参数部分的第一个参数。
while (*tmp != '\0')//它的第一个参数是va_list的变量名,第2个参数是省略号前最后一个有名字的参数。
{
if (*tmp == 'c')
{
putchar(va_arg(arg, char));//定义va_arg来访问参数,这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。
}
else if (*tmp == 's')
{
puts(va_arg(arg, char*));
}
else if (*tmp == 'd')
{
int d = va_arg(arg, int);
printf("%d\n", d);
}
tmp++;
}
va_end(arg); //当访问完最后一个可变参数之后,我们需要调用va_end。
}
int main()
{
print("s ccccc d \n", "hello", 'w', 'o', 'r', 'l', 'd', 100);
system("pause");
return 0;
}