• 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;
    }
    
    
  • 相关阅读:
    数据结构之线性顺序表ArrayList(Java实现)
    大话数据库技术之数据的检索
    JQuery表单元素过滤选择器
    字典序最小问题
    liferay中数据库表的解析未完
    转载如何实现portlet之间的传递参数
    SpringMVC学习笔记1
    深度优先搜索算法
    Ants-穷举算法
    三角形-穷举算法
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/10410484.html
Copyright © 2020-2023  润新知