zoukankan      html  css  js  c++  java
  • C和C指针小记(十二)-函数的可变参数表

    1、可变参数表是通过宏实现的

    宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start、va_arg、va_end.
    

    我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值.
    参数列表在函数中用三点省略号(...).它表示此处可能传递数量和类型未定的参数.函数原型和函数的定义都要这样做.
    函数中要声明一个名叫 va_arg 的变量,它用于访问参数列表的未定部分.这个变量通过调用va_start来初始化.它的第一个参数是var_list变量的名字.第2个参数是省略号前最后一个有名字的参数.初始化过程把va_arg变量设置为指向可变参数部分的第一个参数.
    为了访问参数,需要使用,va_arg,这个宏接收两个参数:va_list变量和参数列表中下一个参数的类型.在这个例子中,所有的可变参数都是整型.在有些函数中,你可能要通过前面获得的数据来判断下一个参数的类型. va_arg返回这个参数的值,并使var_arg指向下一个可变参数.
    最后,当反问完毕最后一个可变参数之后,我们需要调用va_end;

    2、可变参数的限制

    可变参数必须从头祷文按照顺序逐个访问.可以访问到一半终止,但是不可以一开始就访问参数列表中间的参数.
    由于参数列表中的可变参数部分并没有原型,所以所有作为可变参数传递给函数的值都将执行缺省参数类型提升.
    
    /**
     可变参数的定义,求平均值
    
     @param n_values 参数表中参数的个数
     @param ... 可变参数表
     @return 平均值
     */
    float average(int n_values, ...){
        va_list var_arg;
        int count;
        float sum = 0;
        //准备访问可变参数
        va_start(var_arg, n_values);
        //添加取自可变参数列表的值
        for (count = 0; count < n_values; count += 1) {
            sum += va_arg(var_arg, int);
        }
        //完成处理可变参数
        va_end(var_arg);
        return sum/n_values;
    }
    
    
  • 相关阅读:
    java模式及其应用场景
    redis配置密码 redis常用命令
    Redis可视化工具Redis Desktop Manager使用
    String类和StringBuffer类的区别
    centos下搭建redis集群
    eclipse maven项目中使用tomcat插件部署项目
    什么是反向代理,如何区别反向与正向代理
    数据库连接池的原理
    归并排序
    asio-kcp源码分析
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/10410484.html
Copyright © 2011-2022 走看看