ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C和C指针小记(十一)-函数的可变参数表

2019-02-21 09:54:14  阅读:224  来源: 互联网

标签:va 参数表 可变 list 参数 arg var 小记 指针


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;
}

标签:va,参数表,可变,list,参数,arg,var,小记,指针
来源: https://www.cnblogs.com/wjw-blog/p/10410484.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有