第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课 函数参数的秘密(下)的主要内容,如果未能解决你的问题,请参考以下文章