



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数的指针如何说明、赋值、调用第一个例子说明指向函数的指针如何说明、赋值、调用。 #include #define TESTDATE 100 int func(int a)/*func用于打印一个整数*/ return printf(%dn,a); main() int (*FunctionPionter)(int a); FunctionPionter = func; (*FunctionPionter)(TESTDATE); return 0; 其中重点语句的含义如下: int (*FunctionPionter)(int a); FunctionPionter: 指向一个返回整数的函数的指针,这个指针有一个整数参数。 FunctionPionter = func; 将FunctionPionter指向函数func;其中函数必须已经定义,且函数和函数指针的说明的返回值必须一致。 (*FunctionPionter)(TESTDATE); 通过函数指针调用函数;因为函数指针已经指向函数,所以用*取出函数指针的内容就为函数本身。 下面这个例子显示如何将指向函数的指针传递给函数、作为函数的返回类型。在这个例子中,有三个函数: hello:返回字符指针的函数,用来返回字符串“hello world!n” RetFunc:返回一个指向函数的指针的函数,且返回指针所指的那个函数为一个返回字符指针的函数。 call:返回一个void *型的指针,且call有一个指向函数的指针的参数,且这个函数指针返回一个字符指针 #include #include char *hello() /*返回字符指针的函数*/ return Hello World!n; /* 返回一个指向函数的指针的函数,且返回指针所指的那个函数为一个返回字 符指针的函数。 */char *(*RtnFunc()() return hello; void *call(char *(*func)() return (*func)(); int main(void) puts(call(RtnFunc(); return 0; 上面的例子中,main()无法直接调用hello函数,利用两个函数分别返回hello和调用hello,实现了在main()中调用hello。虽然,似乎这个程序显得多余但却很好的说明了如何把指向函数的指针传递给函数、作为函数的返回。其中call函数利用了void *型指针的灵活机制,使得call的适用性大为增加,这也正是指向函数的指针的优点之一。同样的例子是The C Programming Language Second Edition中下面这个函数调用: qsort(void *) lineptr, 0, nlines-1, (int (*)(void *, void *)(numeric ? numcmp : strcmp); 其中,使用了两次强制类型转换,其中第二甚至是利用指向函数的指针,将函数的类型进行了转换。当然上面语句在某些编译器上无法通过,因为某些编译器要求条件表达: 表达式1 ? 表达式2 : 表达式3 中表达式与表达式的类型相同。当然这样的要求是不符合ANSI标准的。在ANSI标准中,如果表达式与表达式的类型不同,则结果的类型由类型转换规则决定。当然,我们可以变同一下,先将两个函数的类型进行强制转换来达到目的: qsort(void *) lineptr, 0, nlines-1, numeric ? (int (*)(void *, void *)numcmp : (int (*)(void *, void *)strcmp); 对于如何直接说明一个像RtnFunc一样返回指向函数的指针的函数,我查阅了不少资料,都没有找到答案,最后是自己硬着头皮摸索出来的。由此,我也对C的复杂说明有了更深刻的体会,将在以后的技术日记中写出来。当然在我看来,过多的、不合适的使用这些复杂说明,并不是一种好的编程风格,因为它将使程序变得难以理解,同时也增加了出错的可能性。 一个比较好的折衷的方法是使用typedef来使程序的含义明朗。下面给出用typedef给写上面那个程序的例子,其中定义个一个类型PtoFun,用typedef说明PtoFun是指向函数的指针类型,指针所指的函数返回一个字符指针,且没有参数。 #include #include typedef char *(*PtoFun)(); char *hello() return Hello World!n; PtoFun RtnFunc() return hello; void *call(PtoFun func) return (*func)(); int main(void) printf(%s,call(RtnFunc(); return 0; 改写后的程序的可读性大为增加,给人一目了然的感觉。 再看一个例子: 看下面的有关函数指针的赋值语句:transition-method = (void (*)(void *, void *) &ict_snd_invite;transition-method = (void (*)(void *, void *) ict_snd_invite;其中的transition变量是transition_t *类型的,typedef struct _transition_t state_t state; type_t type; void (*method) (void *, void *);transition_t;ict_snd_invite()函数的定义为:void ict_snd_invite (transaction_t * ict, sipevent_t * evt);这两条赋值语句有什么区别吗?transition-method = (void (*)(void *, void *) &ict_snd_invite;transition-method = (void (*)(void *, void *) ict_snd_i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林服务相关知识培训课件
- 桥梁监理安全知识培训课件
- 2025年外贸业务员招聘面试题及解析大全集
- 2025建筑安全员《C证》考试题库及答案
- 2025年设计笔试常见题含答案解析
- 2025年可持续发展与环境政策考试试题及答案
- 2025年数据分析师金融分析方向面试技巧与模拟题集
- 2025年金融风险管理师FRM考试指南与备考策略
- 2025年篮球理论试题及答案
- 2025年餐饮服务行业招聘考试模拟题集
- 部编小学语文四年级上册第一单元大单元教学设计
- 医院检验科实验室生物安全管理手册
- 选品与采购全套教学课件
- 关于女性生殖健康知识讲座
- 全国新闻记者职业资格考试一本通
- DB13-T 5838-2023大型会展活动临建设施安全、绿色管理通用要求
- 2023年福建省泉州市初中化学学科教学研训讲座-明晰目标要求优化行动策略
- 创伤失血性休克中国急诊专家共识(2023)解读
- 山西人文知识竞赛考试题库及答案(500题)
- 医疗器械操作规程
- (订正版)全面质量管理知识习题集大全(含答案)
评论
0/150
提交评论