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 —— 智能指针(十二)
在管理动态分配的内存时,一个最棘手的问题就是决定何时释放这些内存,而智能指针就是用来简化内存管理的编程方式.智能指针一般有独占和共享两种所有权模型.-------------------------- ...
随机推荐
- keras 文本分类 LSTM
首先,对需要导入的库进行导入,读入数据后,用jieba来进行中文分词 # encoding: utf-8 #载入接下来分析用的库 import pandas as pd import numpy as ...
- COMBINATORIAL TESTING
COMBINATORIAL TESTING -Test note of “Essential Software Test Design” 2015-09-06 Content 16.1 Coverag ...
- Android Launcher分析和修改6——页面滑动(PagedView)
本来打算分析CellLayout的源码,不过因为它们之间是容器包含关系,所以打算先把PagedView分析.PagedView代码很多,今天主要是分析跟核心功能相关的代码.PagedView主要实现一 ...
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-3 底层驱动之液晶显示
源视频包下载地址: 链接:http://pan.baidu.com/s/1pKSUU2v 密码:4zme 银杏科技优酷视频发布区: http://i.youku.com/gingko8
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- Opencv Mat运算(转)
一.矩阵Mat I,img,I1,I2,dst,A,B; double k,alpha; Scalar s; //注意Mat的行列号是从0开始的 //定义矩阵a,b,c Mat a,b,c; //生成 ...
- 为app录制展示gif
已同步更新至个人blog:http://dxjia.cn/2015/07/make-gif-for-app/ 在github上好多不错的开源项目展示demo的时候,都是采用了一个gif图片,很生动具体 ...
- [Model] VGG16
Jeff: fast.ai lesson 1&2感觉没讲什么干货. ~/keras/keras.json配置后台theano or tensorflow. ~/./theanorc处理器配置 ...
- 重写 Ext.form.field 扩展功能
直接代码,放项目overrides文件夹中即可 //重写类 表单父类 //支持allowBlank动态绑定 Ext.define("override.form.field.Base" ...
- LinkedIn文本分析平台:主题挖掘的四大技术步骤
作者 Yongzheng (Tiger) Zhang ,译者 木环 ,本人只是备份一下.. LinkedIn前不久发布两篇文章分享了自主研发的文本分析平台Voices的概览和技术细节.LinkedIn ...