可变参数函数顾名思义,就是函数参数个数是未知的是可变的。
(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; }