- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
宏va_list使用方法简介
以下介绍几个va宏的使用方法(va_start,va_arg,va_end):
首先理解什么是宏:通常我们在编程时会遇到一个程序段在篇幅中多次要应用,例如输出函数(打印结果),许多程序都要用到,这时我们不必在每个程序都写上一段打印的程序,我们只要用printf();来表达就可以了,也就是printf();是个宏。简单理解成:宏在编程时就是用一个标号(例如printf();)来替代一段程序。
定义函数块时,变量在内存中的存储方式(不同的编辑器有区别,一下介绍VC++6.0):例如定义两个整数相加的函数:add(int a,int b){int c=a+b;return c;}这时a,b在内存中的存储如下(在写出int a,intb时就为a,b开辟了内存空间):
b a 采用堆栈的形式,先进的数放下面
几个va宏的使用(以下用到的例子来自实验课上的一道例题):
在使用va宏时要先定义库函数:#include stdarg.h
在使用va宏时还要先定义类型:va_list 就像使用一个整型变量a时要先对其定义:int a; 同理在使用一个va型变量ap时也要对其定义:va_list ap;
va_start的使用:int InitArray(Array A,int dim,...)在这个函数中要用到va_start,va_arg,va_end。首先对其在内存中的存储结构进行理解(其中“…”代表可变参数,就是在调用函数时可以这样:InitArray(A,2,4,5);或者InitArray(A,3,4,5,6);就是个数和数值都可变)InitArray(A,3,5,6,7);的存储结构如下:
7 6 5 3 A va_start(ap,dim);这个宏里面的参数dim就是3,ap相当于指针指向3的下一个存储单元5(由于采用堆栈的存储结构所以存储时自下而上)
va_arg的使用:va_arg(ap,int);这个宏里面的ap就是va_start(ap,dim)?;里面定义的指针ap.这个宏是用来读取数据的,将ap指向的数据读取出来并强制转换为int型,同时ap指向下一个存储单元
va_end的使用:va_end是va_start的反,va_start(ap,dim)定义了一个指针ap指向堆栈中的存储单元,而va_end(ap)则是把指针ap从堆栈中移除。在下面多维数组的存取例子中,由于ap指针最后一次移动时离开存储区,所以不用va_end(ap)可以照样执行
附件(多维数组的存取):
#includestdio.h
#includestdarg.h//va_start,va_arg,va_end
#includemalloc.h
#define MAX_ARRAY_DIM 8
#define ElemType int
typedef struct{
ElemType *base;
int dim;
int *bounds;
int *constants;
}Array;//多维数组的定义
int InitArray(Array A,int dim,...){
if(dim1||dimMAX_ARRAY_DIM) return -1;
A.dim=dim;//维数
A.bounds=(int *)malloc(dim*sizeof(int));//边界
if(!A.bounds) return -1;
int elemtotal=1;
va_list ap;//定义类型
va_start(ap,dim);//初始化
for(int i=0;idim;i++){
A.bounds[i]=va_arg(ap,int);//读取ap指向的数据
if(A.bounds[i]0) return -1;
elemtotal*=A.bounds[i];
}
va_end(ap);//移除ap
A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
A.constants=(int *)malloc(dim*sizeof(int));
A.constants[i-1]=1;
for(i=dim-2;i=0;i--)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return 1;
}//构建多维数组
int Locate(Array A,va_list ap,int off){
off=0;
for(int i=0;iA.dim;++i){
int ind=va_arg(ap,int);
if(ind0||ind=A.bounds[i]) retur
您可能关注的文档
- 安庆市示范高中213届《细胞中的元素和化合物》测试题.doc
- 安庆市中小学教师员培训备好课.doc
- 安庆市怀宁县农村用合作联社.doc
- 安庆石化安全生产令管理规定.doc
- 安庆竟然有这么多七的东西.doc
- 安庆师范学院人文育通识型人才培养模式的创新教学成果奖支撑材料.doc
- 安庆石化炼化一体项目受限空间作业安全管理规定.doc
- 安康学院教学质量教学改革工程.doc
- 安康市2010年病预防控制和卫生应急工作要点.doc
- 安康市居民投资理行为调研报告.doc
- 注册验船师高频真题题库2025.docx
- 注册验船师高频题库带解析2025.docx
- 注册验船师考试必备资料2025.docx
- 注册验船师精选题库带分析2025.docx
- 注册验船师考前冲刺必刷题附答案2025.docx
- 新高考生物二轮复习讲练测第10讲 人体的稳态与免疫调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第13讲 生物技术与工程(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第9讲 神经调节与体液调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第7讲 遗传的基本规律与伴性遗传(检测)(原卷版) .docx
- 新高考生物二轮复习讲练测第13讲 生物技术与工程(检测)(原卷版).docx
文档评论(0)