- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c语言中可变参数函数设计方案
c语言中可变参数函数的设计
c语言中可变参数函数的设计
c语言中可变参数函数的设计
----- 最近想好好学学这个, 先把网上搜集得资料贴上.
======================================================================
参数可变函数的实现(上) CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
此文献给如我一般还在探索C语言之路的朋友们。
注:本文中测试程序的编译环境为win2000和VC6.0
缘起:
作为一个程序员,我没有写过参数可变的函数,我相信大部分朋友也没有涉及过,或者我的境界层次太低了。那么缘何我要去揭这一层面纱呢?因为好奇!
我是个思维具有极大惰性的人,曾经识得参数可变函数,也懒得去深究,但是它的三点(函数声明时参数列表中的“…”)却深刻的映入了我的记忆里,而且是带着若干个闪耀的问号。可是就在昨天,在拜读某君的高论时,它再一次出现了。我的资质真的是不太够,因为某君在谈到它时只是给出了stdarg.h中关于它的宏定义,我想大概在高手眼里,点这一下就神会了吧。可是他这么轻轻一点却使留在记忆里曾经的那几个问号无限的膨胀,以至于我这个又菜又懒的所谓程序员也萌生了莫大的好奇。
破题:
但凡所谓“实现”都是从没有到有的过程,但是我只是想去解惑它的实现,因为它原本就是好端端的正为成千上万的程序员们服务。
还是从我们熟悉的printf说起:
如果你是个C语言的程序员,无论你是初学者还是高高手,对于printf都不会陌生,甚至你已经用了无数次了。我已经说过我是个有极大惰性的人,所以每次用printf都是照本宣科,规规矩矩的按教科书上说的做,从来没有问过一个为什么,这就是所谓的“熟视无睹”吧。
其实,printf函数是一个典型的参数可变的函数。在保证它的第一个参数是字符串的条件下,你可以输任意数量任意合法类型的参数。只要你在第一个字符串参数中使用了对应的格式化字符串,你就可以输出正确的值。这难道不是件很有趣的事吗?那它是怎么做到的?
1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有“…”,所以通过标识符来得到是不可能的,我们只有另辟途径。
我们知道函数调用时都会分配栈空间,而函数调用机制中的栈结构如下图所示:
| ...... |
------------------
| 参数2 |
------------------
| 参数1 |
------------------
| 返回地址 |
------------------
|调用函数运行状态|
------------------
可见,参数是连续存储在栈里面的,那么也就是说,我们只要得到可变参数的前一个参数的地址,就可以通过指针访问到那些可变参数。但是怎么样得到可变参数的前一个参数的地址呢?不知道你注意到没有,参数可变函数在可变参数之前必有一个参数是固定的,并使用标识符,而且通常被声明为char*类型,printf函数也不例外。这样的话,我们就可以通过这个参数对应的标识符来得到地址,从而访问其他参数变得可能。我们可以写一个测试程序来试一下:
#include stdio.h
void va_test(char* fmt,...);//参数可变的函数声明
void main()
{
int a=1,c=55;
char b=b;
va_test(,a,b,c);//用四个参数做测试
}
void va_test(char* fmt,...) //参数可变的函数定义,注意第一个参数为char* fmt
{
char *p=NULL;
p=(char *)fmt;//注意不是指向fmt,而是指向fmt,并且强制转化为char *,以便一个一个
您可能关注的文档
- Buffer cache 调整与优化(二).doc
- Byriog交通部公路监理工程师资格考试模拟考试及答案道路桥梁6.doc
- B柱耐撞性与轻量化优化设计方案研究----轿车.doc
- b章生命中基础有机物质单元检测题.doc
- B样条曲线曲面性质及其生成算法研究.doc
- C++中string函数.doc
- C++MFCcombobox和listcontrol控件使用.doc
- C++常见笔考试及答案.doc
- BIM技术在复杂结构施工中应用.doc
- c++程序控制结构习题答案.doc
- 2023年山西省运城市垣曲县自然资源局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省长治市平顺县科技和工业信息化局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省运城市芮城县发展和改革局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省长治市沁源县科技和工业信息化局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年广东省云浮市云安区发展和改革局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省阳泉市盂县人力资源和社会保障局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年广东省云浮市云安区退役军人事务局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省阳泉市城区卫生健康局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省运城市夏县市场监督管理局公务员考试《行政职业能力测验》历年真题及详解.docx
- 2023年山西省长治市沁源县残联公务员考试《行政职业能力测验》历年真题及详解.docx
文档评论(0)