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;
}
C和C指针小记(十二)-函数的可变参数表的更多相关文章
- C和C指针小记(十)-函数
1.函数的定义 函数的定义就是函数体的实现. 语法: 类型 函数名(形式参数) 代码块 函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工 ...
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; ...
- C和指针 第十二章 结构体 习题
12.3 重新编写12.7,使用头和尾指针分别以一个单独的指针传递给函数,而不是作为一个节点的一部分 #include <stdio.h> #include <stdlib.h> ...
- C和指针 第十二章 使用结构和指针
链表是一种常用的数据结构,每个节点通过链或者指针链接在一起,程序通过间接指针访问链表中的节点. typedef struct Node { //指向下一个节点的指针 struct Node *next ...
- C和C指针小记(十八)-使用结构和指针-双向链表
1.双链表 1.1 双向链表的声明 在一个双链表中,每个节点都包含两个指针--指向前一个节点的指针和指向后一个节点的指针. 声明 typedef struct NODE { struct NODE * ...
- C和C指针小记(十六)-动态内存分配
动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...
- C和C指针小记(十四)-字符串、字符和字节
1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...
- C和C指针小记(一)-字符输入,函数,ASCII扩展表
1.连续接收输入字符时 int ch; while(ch != EOF && ch != '\n') ch 为什么被声明为整形,我们不是需要用它来读取字符的嘛? 因为:EOF是一个整形 ...
- C++ template —— 智能指针(十二)
在管理动态分配的内存时,一个最棘手的问题就是决定何时释放这些内存,而智能指针就是用来简化内存管理的编程方式.智能指针一般有独占和共享两种所有权模型.-------------------------- ...
随机推荐
- git报ssh variant 'simple' does not support setting port解决办法
解决办法 在git bash中输入命令 1 git config --global ssh.variant ssh 照着来一遍,肯定解决
- Effective Java 第三版——36. 使用EnumSet替代位属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- ECMAScript 6 入门之字符串
1.新增字符串的方法 1.字符是否存在 console.log("Yo".indexOf("Y")!=-1); console.log("Yo&quo ...
- 【Android】Android的快速开发框架Afinal
Afinal简介 Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp. 通过finalA ...
- android开发(47) 使用xml drawable 实现 局部圆角,可用作圆角边框
代码如下: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" ...
- Java知多少(92)滚动条
滚动条(JScrollBar)也称为滑块,用来表示一个相对值,该值代表指定范围内的一个整数.例如,用Word编辑文档时,编辑窗右边的滑块对应当前编辑位置在整个文档中的相对位置,可以通过移动选择新的编辑 ...
- linux 防火墙 ufw使用
ufw是ubuntu是默认的防火墙配置工具,相对于iptables,ufw使用更加简单 ufw基本操作 1 []是代表可选内容,需要root权限 ufw [--dry-run] enable|di ...
- 概率霍夫变换(Progressive Probabilistic Hough Transform)原理详解
概率霍夫变换(Progressive Probabilistic Hough Transform)的原理很简单,如下所述: 1.随机获取边缘图像上的前景点,映射到极坐标系画曲线: 2.当极坐标系里面有 ...
- 3、一、Introduction(入门):2、Device Compatibility(设备兼容性)
2.Device Compatibility(设备兼容性) Android is designed to run on many different types of devices, from ...
- rtmp推送aac没有声音的问题记录
症状是这样的:用librtmp推流aac后,用vlc能收到推流的声音,但是用flash却播放不了推流的声音. 查了几天,用工具抓取推流的数据,发现rtmp数据包中的头部信息有一个Chunk S ...