- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境搭建
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策语句
- C - 决策语句
- C - if语句
- C - if...else语句
- C - 嵌套if语句
- C - switch语句
- C - 嵌套switch语句
- C语言中的循环
- C - 循环
- C - while循环
- C - for循环
- C - do...while循环
- C - 嵌套循环
- C - 无限循环
- C - break语句
- C - continue语句
- C - goto语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 变参函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 野指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或枚举类型)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- C - 编译指示
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类别
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
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> // Variadic function to add numbers 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> // Variadic function to add numbers 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\n", string1); char * string2 = concat(3, "How", "are", "you?"); printf("%s\n", string2); return 0; }
输出
运行代码并检查其输出:
Hello World How are you?
广告