可变参数函数分析(va_list,va_start(),va_end())
2016-07-17 19:10
357 查看
注意:函数参数是以数据结构:栈的形式存取,从右至左入栈。
int add(int num,...) //num为可变参数的个数
{
va_list argp;
//typedef char * va_list
va_start(argp,num); // #define va_start _crt_va_start #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
//先根据num的地址得到次函数参数在堆栈中的地址(一连串的参数在堆中的地址是连续的),然后得到第一个参数的地址
for(int i=0;i<num;i++)
{
int temp=va_arg(argp,int); //#define va_arg _crt_va_arg #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//以int型的格式遍历,在内存中的表现形式:以sizeof(int)长度递增,依次读取每个函数值
}
va_end(argp); //#define va_end _crt_va_end #define _crt_va_end(ap) ( ap = (va_list)0 )
//对变量列表的指针赋为空,即不再遍历
}
int add(int num,...) //num为可变参数的个数
{
va_list argp;
//typedef char * va_list
va_start(argp,num); // #define va_start _crt_va_start #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
//先根据num的地址得到次函数参数在堆栈中的地址(一连串的参数在堆中的地址是连续的),然后得到第一个参数的地址
for(int i=0;i<num;i++)
{
int temp=va_arg(argp,int); //#define va_arg _crt_va_arg #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//以int型的格式遍历,在内存中的表现形式:以sizeof(int)长度递增,依次读取每个函数值
}
va_end(argp); //#define va_end _crt_va_end #define _crt_va_end(ap) ( ap = (va_list)0 )
//对变量列表的指针赋为空,即不再遍历
}
相关文章推荐
- Android线程和线程池
- phpStudy for Linux (lnmp+lamp一键安装包)
- HDU 2102 A计划
- ParalleX OS 设计与实现 启动篇multiboot方式
- GNS3-1.0 IOU lincense出现无效证书的解决方式
- 加载plist数据
- HBase hbck——检察HBase集群Region的一致性
- 面试题-----(StringBuffer)
- JSP概述
- Python学习进程(3)Python基本数据类型
- 初识Yarn, Mesos and Borg
- Android stdio的彻底删除
- 欢迎使用CSDN-markdown编辑器
- CODEFORCES 25E Test
- yum 配置
- Android studio 手机快速测试
- Android基础总结(2)——活动Activity
- UVA 12382 Grid of Lamps 贪心
- velocity格式化date
- 页面控制利器——JSTL标签库