网站大量收购独家精品文档,联系QQ:2885784924

宏va_list使用方法简介.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

ikangdwe + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档