c语言中可变参数函数的设计

c语言中可变参数函数的设计

ID:17920136

大小:28.49 KB

页数:20页

时间:2018-09-10

c语言中可变参数函数的设计_第1页
c语言中可变参数函数的设计_第2页
c语言中可变参数函数的设计_第3页
c语言中可变参数函数的设计_第4页
c语言中可变参数函数的设计_第5页
资源描述:

《c语言中可变参数函数的设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、c语言中可变参数函数的设计c语言中可变参数函数的设计c语言中可变参数函数的设计-----最近想好好学学这个,先把网上搜集得资料贴上.======================================================================参数可变函数的实现(上)CSDNBlog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。此文献给如我一般还在探索C语言之路的朋友们。注:本文中测试程序的编译环境为win

2、2000和VC6.0缘起:作为一个程序员,我没有写过参数可变的函数,我相信大部分朋友也没有涉及过,或者我的境界层次太低了。那么缘何我要去揭这一层面纱呢?因为好奇!我是个思维具有极大惰性的人,曾经识得参数可变函数,也懒得去深究,但是它的三点(函数声明时参数列表中的“…”)却深刻的映入了我的记忆里,而且是带着若干个闪耀的问号。可是就在昨天,在拜读某君的高论时,它再一次出现了。我的资质真的是不太够,因为某君在谈到它时只是给出了中关于它的宏定义,我想大概在高手眼里,点这一下就神会了吧。可是他这么轻轻一点却使留在记忆里曾经的那几个问号无限的膨

3、胀,以至于我这个又菜又懒的所谓程序员也萌生了莫大的好奇。破题:但凡所谓“实现”都是从没有到有的过程,但是我只是想去解惑它的实现,因为它原本就是好端端的正为成千上万的程序员们服务。还是从我们熟悉的printf说起:如果你是个C语言的程序员,无论你是初学者还是高高手,对于printf都不会陌生,甚至你已经用了无数次了。我已经说过我是个有极大惰性的人,所以每次用printf都是照本宣科,规规矩矩的按教科书上说的做,从来没有问过一个为什么,这就是所谓的“熟视无睹”吧。其实,printf函数是一个典型的参数可变的函数。在保证它的第一个参数是字符串的条件下,你可以

4、输任意数量任意合法类型的参数。只要你在第一个字符串参数中使用了对应的格式化字符串,你就可以输出正确的值。这难道不是件很有趣的事吗?那它是怎么做到的?1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有“…”,所以通过标识符来得到是不可能的,我们只有另辟途径。我们知道函数调用时都会分配栈空间,而函数调用机制中的栈结构如下图所示:

5、......

6、------------------

7、参数2

8、------------------

9、参数1

10、-------------

11、-----

12、返回地址

13、------------------

14、调用函数运行状态

15、------------------可见,参数是连续存储在栈里面的,那么也就是说,我们只要得到可变参数的前一个参数的地址,就可以通过指针访问到那些可变参数。但是怎么样得到可变参数的前一个参数的地址呢?不知道你注意到没有,参数可变函数在可变参数之前必有一个参数是固定的,并使用标识符,而且通常被声明为char*类型,printf函数也不例外。这样的话,我们就可以通过这个参数对应的标识符来得到地址,从而访问其他参数变得可能。我们可以写一个测试程序来试一下:#include

16、o.h>voidva_test(char*fmt,...);//参数可变的函数声明voidmain(){inta=1,c=55;charb='b';va_test("",a,b,c);//用四个参数做测试}voidva_test(char*fmt,...)//参数可变的函数定义,注意第一个参数为char*fmt{char*p=NULL;p=(char*)&fmt;//注意不是指向fmt,而是指向&fmt,并且强制转化为char*,以便一个一个字节访问for(inti=0;i<16;i++)//16是通过计算的值(参数个数*4个字节),只是为了测试,暂且

17、将就一下{printf("%.4d",*p);//输出p指针指向地址的值p++;}}编译运行的结果为0056000000660000

18、0001000000000000

19、0098000000000000

20、0055000000000000由运行结果可见,通过这样方式可以逐一获得可变参数的值。至于为什么通常被声明为char*类型,我们慢慢看来。2,怎样确定参数类型和数量通过上述的方式,我们首先解决了取得可变参数值的问题,但是对于一个参数,值很重要,其类型同样举足轻重,而对于一个函数来讲参数个数也非常重要,否则就会产生了一系列的麻烦来。通过访问存储参数的栈空间

21、,我们并不能得到关于类型的任何信息和参数个数的任何信息。我想你应该想到了——使用char*参数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。