C语言之变参函数
C语言 函数
2023-09-11 14:15:38 时间
实现可变参数函数max_int
,从若干个传入的参数中返回最大值。
int max_int(int a, ...);
- 如何获得
a
往后的参数列表?va_list
类型的变量 - 如何定位
a
后面第一个参数的位置?va_start
函数 - 如何获取下一个可变参数列表中的参数?
va_arg
函数 - 如何结束整个获取可变参数列表的动作?
va_end
函数
总结来说:
va_list
类型的变量:存储变参列表中的参数va_start
函数:定位变参列表中的第一个参数va_end
函数:va_start
之后就要用va_end
结束va_arg
函数:获取变参列表中的下一个参数
这些宏都定义在头文件stdarg.h
中:
1、
void va_start(va_list argptr, lastparam);
宏va_start
使用第一个可选参数的位置来初始化argptr
参数指针。该宏的第二个参数必须是该函数最后一个有名称参数的名称。必须调用该宏,才可以开始使用可选参数。
2、
type va_arg(va_list argptr, type);
展开宏va_arg
会得到当前argptr
所引用的可选参数,也会将argptr
移动到列表中的下一个参数。宏va_arg
的第二个参数是刚刚被读入的参数的类型。
3、
void va_copy(va_list dest, va_list src);
宏va_copy
使用当前的src值来初始化参数指针dest
。然后就可以使用dest
中的备份获取可选参数列表,从src
所引用的位置开始。
max_int
函数的代码实现:
#include <stdio.h>
#include <stdarg.h>
int max_int(int n, ...) {//n为参数个数
if (n < 0) return 0;
int ans = 0;
va_list arg;//存储...中所有的值
va_start(arg, n);//变参列表的参数赋值给arg,初始化arg
while (n--) {
int temp = va_arg(arg, int); //对每个可选参数,读取类型为int的参数
if (temp > ans) ans = temp;
}
va_end(arg);
return ans;
}
int main() {
printf("%d\n", max_int(3, 1, 2, 5)); //5
printf("%d\n", max_int(2, 1, 7, 17)); //7
printf("%d\n", max_int(3, 3, 6, 18)); // 18
return 0;
}
相关文章
- C语言--函数
- C语言memset函数详解
- C/C++学习----C语言简介
- 遗传算法的C语言实现(一):以非线性函数求极值为例
- 【原创】C语言时间函数简介
- C语言:strcpy()和memcpy()
- C语言sprintf与sscanf函数[总结]
- C语言/C++常见习题问答集锦(五十九) 之猴子摘(分)桃
- C语言/C++常见习题问答集锦(四十) 之分门别类
- C语言/C++常见习题问答集锦(九)
- C语言/C++常见习题问答集锦(七)
- [C语言]使用函数
- ZZNUOJ_C语言1100:求组合数(函数专题)(完整代码)
- C语言入门之枚举类型
- 练习 用C语言编写一个程序,解释高等数学中的映射、单射和一一映射,并表示为函数。
- C语言每日面试之仿动态数组
- C语言之根据路径获取文件名
- C语言之修改文件大小
- C语言面试 写一个函数查找两个字符串中的第一个公共字符串
- 程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)
- C语言主函数main调用带有结构体指针参数的函数的指定类型返回值
- C语言实现结构体返回两值或多值:结构体定义函数的类型
- C语言给结构体赋数据值和带有结构体指针变量的赋值方法
- 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”
- C语言---函数递归---详解
- C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数。在主函数中输入两个正整数m和n(m>=1,n>m),统计并输出m和n之间的素数的个数以及这些素数的和。
- C语言结构体通过 scanf初始化
- 1.编写一个简单的C语言程序:计算输入多个整数的平均值,并将此程序分割成多个小文件。 2.为第1题中的程序编写makefile文件,用make编译后改成返回最小值,再编译,观察有多少文件不需要重新