zoukankan      html  css  js  c++  java
  • 函数参数下

    参数入栈顺序

    • 函数参数的计算次序是依赖编译器实现的,
      问:函数参数的入栈次序是如何确定的呢?

    调用约定

    • 当函数调用发生时
      • 参数会传递给被调用的函数
      • 而返回自会被返回给函数调用者
    • 调用约定描述参数如何传递到栈中以及栈的维护方式
      • 参数传递顺序
      • 调用栈清理
    • 调用约定是预定义的可以理解为调用协议
    • 调用约定通常用于库调用和库开发的时候
      • 从右到左依次入栈:_stdcall,_cdecl,_thiscall
      • 从左到右依次入栈:_pascal,_fastcall

    若A编译器是C语言编译器(默认从右到左),B编译器是Pascal编译器(从左到右),就需要调用约定

    一个小问题

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

    #include<stdio.h>
    
    double average(int a[],int n)
    {
        double sum = 0;
        int i;
        for(i=0;i<n;i++)
        {
            sum += a[i];
        }
    
        return sum/n;
    
    }
    
    int main()
    {
        int a[]={1,2,3,4,5};
        printf("%lf
    ",average(a,5));
        return 0;
    }
    
    

    可变参数

    • C语言中可以定义参数可变的函数
    • 参数可变函数的是实现依赖于stdarg.h头文件
      • va_list 参数集合
      • va_arg 取具体参数值
      • va_start 标识参数访问的开始
      • va_end 标识参数访问的结束

    例子2:

    #include <stdio.h>  
    #include <stdarg.h>  
      
    float average(int n, ...)  
    {  
        va_list args;  
        int i = 0;  
        float sum = 0;  
          
        va_start(args, n);  
          
        for(i=0; i<n; i++)  
        {  
            sum += va_arg(args, int);  
        }  
          
        va_end(args);  
          
        return sum / n;  
    }  
      
    int main()  
    {  
        printf("%f
    ", average(5, 1, 2, 3, 4, 5));  
        printf("%f
    ", average(4, 1, 2, 3, 4));  
          
        return 0;  
    }  
    

    可变参数的限制

    • 可变参数必须从头到尾按照顺序逐个访问
    • 参数列表中至少要存在一个确定的命名参数
    • 可变参数函数无法确定实际存在的参数的数量
    • 可变参数函数无法确定参数的实际类型

    注意:va_arg中如果指定了错误的类型,那么结果是不可预测的

    小结

    • 调用约定指定了函数参数的入栈顺序以及栈的清理方式
    • 可变参数是C语言提供的一种函数设计技巧
    • 可变参数的函数提供了一种更方便的函数调用方式
    • 可变参数必须顺序的访问,无法直接访问中间的参数值
  • 相关阅读:
    Python装饰器实现几类验证功能做法(续)
    10周年整
    年中review
    Javascript 模块化开发上线解决方案
    AMDJS编译工具
    第三方组件接入方案(演示文稿图片)
    代码打包预处理工具
    manifest资源提取工具
    也来山寨一版Flappy Bird (js版)
    2014 todo list
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9213297.html
Copyright © 2011-2022 走看看