C 语言中的可变参数函数
可变参数函数是C 语言中功能强大但很少使用的特性之一。可变参数函数为应用程序结构的编程增添了极大的灵活性。
C 语言中的可变参数函数
可以接受可变数量参数的函数称为可变参数函数。定义可变参数函数需要一个固定参数。
C 语言中最常用的库函数,即 printf() 和 scanf(),实际上是可变参数函数最著名的例子,因为我们可以在格式说明符字符串后放置可变数量的参数。
printf("format specifier",arg1, arg2, arg3, . . .);
可变参数函数的语法
在 C 语言中,可变参数函数定义为至少有一个固定参数,后面跟着一个省略号 (...),以便编译器解析可变数量的参数。
return_type function_name(type arg1, ...);
您需要在代码顶部包含 stdarg.h 头文件 来处理可变参数。此头文件提供以下宏,用于处理省略号接收的参数。
| 方法 | 描述 |
|---|---|
| va_start(va_list ap, arg) | 最后一个固定参数之后的参数存储在 va_list 中。 |
| va_arg(va_list ap, type) | 每次,变量列表 va_list 中的下一个参数并将其转换为给定类型,直到到达列表末尾。 |
| va_copy(va_list dest, va_list src) | 这将创建 va_list 中参数的副本 |
| va_end(va_list ap) | 这将结束对可变参数函数参数的遍历。到达 va_list 末尾后,列表对象将被清理。 |
C 语言中可变参数函数的示例
示例:使用可变参数函数计算数值之和
以下代码使用可变参数函数的概念,返回传递给该函数的可变数量数值参数之和。addition() 函数的第一个参数是剩余参数的数量。
在 addition() 函数内部,我们按如下方式初始化 va_list 变量 -
va_list args; va_start (args, n);
由于后续参数数量为 n,因此使用宏"va_arg()"获取下一个参数 n 次,并执行累加操作 −
for(i = 0; i < n; i++){
sum += va_arg (args, int);
}
最后,清理 va_list 变量 −
va_end (args);
函数结束时返回所有参数的和。
完整代码如下 −
#include <stdio.h>
#include <stdarg.h>
// 用于添加数字的可变函数
int addition(int n, ...){
va_list args;
int i, sum = 0;
va_start (args, n);
for (i = 0; i < n; i++){
sum += va_arg (args, int);
}
va_end (args);
return sum;
}
int main(){
printf("Sum = %d ", addition(5, 1, 2, 3, 4, 5));
return 0;
}
输出
运行代码并检查其输出 −
Sum = 15
您可以尝试为 addition() 函数提供一组不同的数字作为可变参数。
示例:使用可变函数查找最大值
我们可以扩展可变函数的概念,以便在给定的可变值列表中查找最大值。
#include <stdio.h>
#include <stdarg.h>
// 用于加法运算的可变函数
int largest(int n, ...){
va_list args;
int i, max = 0;
va_start (args, n);
for(i = 0; i < n; i++){
int x = va_arg (args, int);
if (x >= max)
max = x;
}
va_end (args);
return max;
}
int main(){
printf("Largest number in the list = %d ", largest(5, 12, 34, 21, 45, 32));
return 0;
}
输出
运行此代码时,将产生以下输出 -
Largest number in the list = 45
示例:使用可变参数函数连接多个字符串
在下面的代码中,我们将多个字符串传递给一个可变参数函数,该函数返回一个连接后的字符串。
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
char * concat(int n, ...){
va_list args;
int i;
static char string[100], *word;
va_start (args, n);
strcpy(string, "");
for (i = 0; i < n; i++){
word= va_arg (args, char *);
strcat(string, word);
strcat(string, " ");
}
va_end (args);
return string;
}
int main(){
char * string1 = concat(2, "Hello", "World");
printf("%s
", string1);
char * string2 = concat(3, "How", "are", "you?");
printf("%s
", string2);
return 0;
}
输出
运行代码并检查其输出 −
Hello World How are you?

