码迷,mamicode.com
首页 > 其他好文 > 详细

第45课 函数参数的秘密(下)

时间:2018-08-30 22:14:11      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:stdarg.h   play   float   return   字符   start   src   还需   函数   

参数入栈顺序:

技术分享图片

 

调用约定:

技术分享图片

 

 

技术分享图片

gcc语言默认使用__cdecl调用约定。调用约定不是语言的一部分,是编译器的一部分。

调用约定使用的最典型的地方就是库函数的调用。因为库的编译方式我们的自己的程序的编译方式可能不一样。

小问题:

如何编写一个计算n个数平均值的函数?

示例程序:

 1 #include <stdio.h>
 2 
 3 float average(int array[], int size)
 4 {
 5     int i = 0;
 6     float avr = 0;
 7     
 8     for(i=0; i<size; i++)
 9     {
10         avr += array[i];
11     }
12     
13     return avr / size;
14 }
15 
16 int main()
17 {
18     int array[] = {1, 2, 3, 4, 5};
19     
20     printf("%f\n", average(array, 5));
21     
22     return 0;
23 }

这里我们求平均值的时候还需要定义数组,那么有没有一种方法,我们不定义数组,而是直接将要求的数的当做参数传进去呢?

那就得使用可变参数函数了。

可变参数:

技术分享图片

 

示例程序:

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 
 4 float average(int n, ...)
 5 {
 6     va_list args;
 7     int i = 0;
 8     float sum = 0;
 9     
10     va_start(args, n);
11     
12     for(i=0; i<n; i++)
13     {
14         sum += va_arg(args, int);
15     }
16     
17     va_end(args);
18     
19     return sum / n;
20 }
21 
22 int main()
23 {
24     printf("%f\n", average(5, 1, 2, 3, 4, 5));
25     printf("%f\n", average(4, 1, 2, 3, 4));
26     
27     return 0;
28 }

第四行程序中中的...就是代表可变参数。

va_list是stdarg.h中的一种数据类型,第6行通过va_list可以得到这些可变参数。

第10行表示我们现在要从args中取值了,第17行表示取值结束。

运行结果如下:

技术分享图片

 

 

printf也是可变参数函数,它并没有规定有多少个参数,但是规定了第一个参数必须是一个字符串。这个字符串可以是格式化的字符串。

字符串中的格式化字符%d、%f就是用来统计可变参数个数的。

可变参数的限制:

技术分享图片

 

printf中当看到%d的时候就知道这个位置应该取出一个int型变量。

 

小结:

技术分享图片

 

第45课 函数参数的秘密(下)

标签:stdarg.h   play   float   return   字符   start   src   还需   函数   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9562930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!