原创 可变参数函数的一个简单例子

2011-5-20 16:42 3750 8 9 分类: 软件与OS

    这里只是简单的描述一下C语言中如何使用参数数量可变的函数,至于stdarg.h中关键宏如何实现以及编译器如何处理这些更底层的东西,以后再说。

    我们知道,C语言中函数体包含三个要素:返回值类型、函数体、参数列表。其中参数列表一般情况下都包含个数及类型确定的参数信息,但是千万不要以为函数的参数就必须是个数确定的,其实我们每天都在用着这些例外的情况:printf(),scanf()..。这种函数的原型一般是ReturnType A (Type a,...Type b,...),第二个省略号即表示该函数参数个数为确定。那么如何在自己的代码中实现这种函数呢?

     举个例子,我们想编写一个函数average(),该函数返回输入参数的平均值,但输入参数的个数是不确定的。我们通过使用stdarg.h中定义的一个数据类型va_list和三个关键宏va_start,va_arg和va_end来实现。其中va_list类型的变量用于访问参数列表中未确定的部分,这个变量通过va_start宏来初始化。该宏接受两个参数,第一个是该va_list类型的变量,第二个是省略号前面最后一个有名字的参数。初始化过程把var_list变量设置为指向可变参数部分的第一个参数。

     为了在函数中访问未确定的参数部分,需要使用va_arg宏,该宏接受两个参数,第一个是前面已经被va_start宏初始化过了的va_list变量,第二个是参数列表中下一个参数的类型。

     当访问完最后一个参数时,我们需要调用va_end宏。

     最后给出一个实例函数 float average(int n_values,...),该函数接受一个确定参数和一个不确定参数列表。确定参数n_values表示未确定参数的个数,函数返回这些n_values个参数的平均值。代码如下:

View Code
1 #include<stdarg.h>
2 #include<iostream.h>
3  float
4 average(int n_values,...)
5 {
6 va_list var_arg;
7 int count;
8 float sum=0;
9
10
11 va_start(var_arg,n_values);
12
13 for(count=0;count<n_values;count++)
14 {
15 sum+=va_arg(var_arg,int);
16 }
17 va_end(var_arg);
18
19 return sum/n_values;
20 }
21
22  void main()
23 {
24 cout<<"1,2,3的平均值为:";
25 cout<<average(3,1,2,3)<<endl;
26
27 cout<<"1,2,3,4的平均值为:";
28 cout<<average(4,1,2,3,4)<<endl;
29
30 cout<<"1,2,3,4,5,6,7,8,9,10)的平均值为:";
31 cout<<average(10,1,2,3,4,5,6,7,8,9,10)<<endl;
32 }

参考文献:《C和指针》

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

yhmcjc_804203354 2011-5-23 12:35

c和指针,我没记错的话是本能防身的白皮书
相关推荐阅读
用户235394 2011-07-09 21:17
你根本不会休息(转)
为什么你睡了11个小时仍然觉得疲累? 为什么你花了好几万去岛国度假并没有增加生活的热情? 都说要去KTV,去夜店,去游乐园就能忘掉不快,更带劲地开始新的一天,但是尽兴归来心里只剩空虚? 我们真的明...
用户235394 2011-06-26 21:17
将数组元素分成两部分,再整体交换位置
昨日去某公司笔试,碰到一个题如下:     对于一个数组,已知其长度为n,和一小于n的正整数p,将该数组的前p个元素和后面的元素交换一下位置,例如a[15]={1,2,3,4,5,6,7,8,9,1...
用户235394 2011-06-20 21:56
《赢在测试》第一章小结
1.人要勤奋 2.人在专心的时候不会感到孤独 3.主动找活干 4.跳槽要有明确的目的,并且对自己要有清晰的定位 5.通过自己反省,来提高自己的能力 6.我们要不停的评估自己的价值 7.软件测试业是不...
用户235394 2011-06-13 16:18
vmware下ubuntu10.04与WinXp共享文件夹hgfs为空的解决办法
  心血来潮要玩一把LFS,于是在vmware下整了个ubuntu系统专门做这个。在安装完虚拟机工具后/mnt/hgfs目录挂载成功,可是在vm中添加了共享文件夹后hgfs依然为空,在网上搜了下,解决...
用户235394 2011-06-13 10:15
批量检验文件md5值
   脚本不是一门放在书上或者技术手册上瞻仰的东西,我们学习它是因为它能给我们的学习工作带来巨大的便利。那么在平时,就应该有随时用脚本完成一些工作的意识。例如,在做lfs时,下载了一大堆的tarbal...
用户235394 2011-06-03 19:43
字符串指针与字符数组的区别
参考文献:《C专家编程》        相信很多同学在初学编程时对char *a=”abcd”和char a[]=”abcd”混淆过,甚至某些教材根本不提其区别,只有在实际编程中出现运行时错误才会...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条