• 函数参数下


    参数入栈顺序

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

    调用约定

    • 当函数调用发生时
      • 参数会传递给被调用的函数
      • 而返回自会被返回给函数调用者
    • 调用约定描述参数如何传递到栈中以及栈的维护方式
      • 参数传递顺序
      • 调用栈清理
    • 调用约定是预定义的可以理解为调用协议
    • 调用约定通常用于库调用和库开发的时候
      • 从右到左依次入栈:_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语言提供的一种函数设计技巧
    • 可变参数的函数提供了一种更方便的函数调用方式
    • 可变参数必须顺序的访问,无法直接访问中间的参数值
  • 相关阅读:
    WordPress插入图片无法居中的解决方法
    wordpress文章显示同一分类下的上一篇下一篇
    git4
    git3
    git2
    git1
    百度地图vue版本标记点拖拽事件传参问题
    postcss-plugin-px2rem的使用
    保留小数位toFixed()方法的怪异表现
    大公司是怎样开发和部署前端代码(转张云龙大神的回答)
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9213297.html
Copyright © 2020-2023  润新知