zoukankan      html  css  js  c++  java
  • 第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型变量。

    小结:

  • 相关阅读:
    暑假每周学习进度-7
    暑假每周学习进度-6
    寒假生活05
    寒假生活04
    寒假生活03
    寒假生活02
    寒假生活01
    软件设计师2019模拟小测
    第二周学习记录
    2019秋季学习计划
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9562930.html
Copyright © 2011-2022 走看看