C 语言可变参数详解:stdarg.h 实战指南
有时需要函数接受可变数量的参数,而非预定义固定参数。C 语言提供了解决方案,允许定义接受可变参数的函数。示例定义如下:
int func(int, ... ) {
...
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
注意:函数 func() 最后一个参数为省略号(...),其前一个参数必须是 int,表示传入的可变参数总数。使用该功能需包含 stdarg.h 头文件,按以下步骤实现:
定义函数,最后参数为省略号,前一个参数为 int 表示参数个数。
在函数内创建 va_list 类型变量(定义于 stdarg.h)。
用 int 参数和 va_start 宏初始化 va_list 变量为参数列表。
用 va_arg 宏和 va_list 变量访问参数列表中每个项。
用 va_end 宏清理 va_list 变量占用的内存。
按上述步骤编写可接受可变参数并返回平均值的函数:
Live Demo#include <stdio.h>
#include <stdarg.h>
double average(int num, ...) {
va_list valist;
double sum = 0.0;
int i;
/* 初始化 valist 为 num 个参数 */
va_start(valist, num);
/* 访问 valist 赋予的所有参数 */
for (i = 0; i < num; i++) {
sum += va_arg(valist, int);
}
/* 清理 valist 保留内存 */
va_end(valist);
return sum / num;
}
int main() {
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
printf("Average of 5, 10, 15 = %f\n", average(3, 5, 10, 15));
}
编译执行输出:
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
注意 average() 被调用两次,每次第一个参数代表后续可变参数的总数。仅省略号用于传递可变数量参数。
C语言
- C 语言用户自定义函数四大模式对比:参数与返回值的设计权衡
- C 语言存储类完全解析:auto、extern、static、register
- C语言中将一维与二维数组传递给函数的实战指南
- C++ 变量与数据类型全解析:int、double、char、string、bool 详细指南
- C 语言变量、数据类型与常量实战指南
- C 语言变量详解:类型、命名规则、定义声明与内存管理
- C 语言函数详解:定义、声明、调用与参数传递
- C 语言指针实战:从入门到高级编程
- C 语言位域:高效内存使用的实战技巧
- C 语言命令行参数完全指南:argc 与 argv 实战详解
- 深入理解 Verilog 赋值语句:类型、语法与最佳实践
- 精通Python函数参数:位置、关键字与默认参数