可变参数列表
来源:互联网 发布:局部搜索算法历史 编辑:程序博客网 时间:2024/06/05 19:09
一般情况下,函数只能接受固定数目的参数,而且,函数能处理的参数个数不超过五个。但有些时候,我们需要传递的参数个数不确定,或者说,参数个数大于五个,例如,求十个数的平均数,并将每个数以参数的形式传递过去,这时候,就需要用到可变参数列表。
先看一个例子:
//使用可变参数列表,通过函数实现N个数字的平均值int average(int n,...){ va_list arg; int i=0; int sum=0; va_start(arg,n); for(i=0;i<n;i++) { sum+=va_arg(arg,int); } return sum/n; va_end(arg);}int main(){ int a=1; int b=2; int c=3; int res1=average(3,a,b,c); int res2=average(2,a,c); printf("%d %d\n",res1,res2); return 0;}
说明:
- va_list 是一种数据类型,相当于宏,它在这里声明了va_list型的变量 arg,来访问参数列表的未确定部分。
- va_start 是用来来初始化变量arg,它的第一个参数是va_list的变量 名,即arg。第二个参数是省略号前第一个有名字的参数。初始化过程是把arg变量设为指向可变参数部分的第一个参数。
- va_arg 是用来访问各个参数的,这个宏接受两个参数,第一个是va_list变量,即arg,第二个是参数列表中下一个参数的类型。
- va_end 是在访问完所有的可变参数时调用的。
可变参数在使用时需要注意以下几点:
1.可变参数必须从头到尾逐个访问,允许半途终止,但是不允许一开始就访问中间参数。
2.参数列表中至少有一个命名参数,若没有,va_start就不能使用。
3.这些宏是无法直接判断实际参数数量的,也无法判断每个参数的类型。
4.若在va_arg中指定的类型是错误的,那么后果不堪设想。
再来一个例子:
//利用可变参数列表求n那个数中的最大值#include <stdio.h>#include <stdarg.h>//使用前记得加头文件int max(int n, ...){ va_list arg; int i = 0; int max = 0; va_start(arg, n); for (i = 0; i < n; i++) { int tmp = va_arg(arg, int); if (max < tmp) { max = tmp; } } return max; va_end(arg);}int main(){ int m1 = max(3, 8, 6, 9); int m2 = max(5, 11, 68, 99, 14, 13); printf("max1=%d max2=%d\n", m1, m2); return 0;}
阅读全文
0 0
- Java可变参数列表
- 可变参数列表
- 关于可变参数列表
- 可变参数列表
- c++ 可变参数列表
- 可变参数列表
- cstdarg可变参数列表
- 可变参数列表
- java可变参数列表
- 可变参数列表
- Java 可变参数列表
- 可变参数列表
- C可变参数列表
- 可变参数列表
- C可变参数列表
- 可变参数列表
- /可变参数列表
- 可变参数列表
- 设计模式Note
- Hibernate入门实例
- Setup phoenix index
- 蓝桥杯 算法训练 Torry的困惑(基本型)
- c++的cout输出控制符
- 可变参数列表
- idea的toString()之json-Templates
- vi /vim自动缩进或者显示行号
- 大连理工大学软件学院数据库复习——SQL语句(《数据库系统概念第6版》)
- Apriori算法进行关联分析(1)
- spring cloud 前人踩过的坑
- java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \
- 开启Mysql慢查询日志
- 上机练习题——异常处理1