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

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第45课 函数参数的秘密(下)相关的知识,希望对你有一定的参考价值。

参数入栈顺序:

技术分享图片

 

调用约定:

技术分享图片

 

 

技术分享图片

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
", 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
", average(5, 1, 2, 3, 4, 5));
25     printf("%f
", 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课 函数参数的秘密(下)的主要内容,如果未能解决你的问题,请参考以下文章

第44课 函数参数的秘密 (上)

第45课 递归的思想与应用(下)

第3课 浮点数的秘密

第3课 浮点数的秘密

第15课 缔造程序兼容的合约(下)

第33课 main函数与命令行参数