版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.函数指针的定义顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:看看上面三个表达式分别是什么意思?C)这很容易,fun3是函数名,pi,P2是参数,其类型为char*型,函数的返回值为char*类型。B)也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。A)funi是函数名吗?回忆一下前面讲解数组指针时的情形。我们说数组指针这么定义或许更清晰:再看看A)表达式与这里何其相似!明白了吧。这里funi不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。同样,我们把这个表达式改写一下:这样子是不是好看一些呢?只可惜编译器不这么想。人—屋.函数指针使用的例子上面我们定义了一个函数指针,但如何来使用它呢?先看如下例子:我们使用指针的时候,需要通过钥匙(取*)其来取其指向的内存里面的值,函数指针使用也如此。通过用(*pf)取出存在这个地址上的函数,然后调用它。这里需要注意到是,在VisualC++6.0里,给函数指针赋值时,可以用&un或直接用函数名fun。这是因为函数名被编译之后其实就是一个地址,所以这里两种用法没有本质的差别。这个例子很简单,就不再详细讨论了。.*(int*)&p 这是什么?也许上面的例子过于简单,我们看看下面的例子:这是在干什么?*(int*)&p=(int)Function;表示什么意思?别急,先看这行代码:这行代码定义了一个指针变量p,p指向一个函数,这个函数的参数和返回值都是void。&p是求指针变量p本身的地址,这是一个32位的二进制常数(32位系统)。(int*)&p表示将地址强制转换成指向int类型数据的指针。(int)Function表示将函数的入口地址强制转换成int类型的数据。分析到这里,相信你已经明白*(int*)&p=(int)Function;表示将函数的入口地址赋值给指针变量p。那么(*p)();就是表示对函数的调用。讲解到这里,相信你已经明白了。其实函数指针与普通指针没什么差别,只是指向的内容不同而已。使用函数指针的好处在于,可以将实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。或者归纳为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开。.(*(void(*)())0)() 这是什么?是不是感觉上面的例子太简单,不够刺激?好,那就来点刺激的,看下面这个例子:这是《CTrapsandPitfalls》这本经典的书中的一个例子。没有发狂吧?下面我们就来分析分析:第一步: ,可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。第二步: ,这是将强制转换为函数指针类型,是一个地址,也就是说一个函段区域内。第三步: ,这是取地址开始的一段内存里面的内容,其内容就是保存在首地函数。第四步: ,这是函数调用。好像还是很简单是吧,上面的例子再改写改写:如果没有上面的分析,肯怕不容易把这个表达式看明白吧。不过现在应该是很简单的一件事了。读者以为呢?.函数指针数组现在我们清楚表达式定义的是一个函数指针pf。既然pf是一个指针,那就可以储存在一个数组里。把上式修改一下:这是定义一个函数指针数组。它是一个数组,数组名为pf,数组内存储了3个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。这念起来似乎有点拗口。不过不要紧,关键是你明白这是一个指针数组,是数组。函数指针数组怎么使用呢?这里也给出一个非常简单的例子,只要真正掌握了使用方法,再复杂的问题都可以应对。如下:可以直接用函数名可以用函数名加上取地址符6函.数指针数组的指针看着这个标题没发狂吧?函数指针就够一般初学者折腾了,函数指针数组就更加麻烦,现在的函数指针数组指针就更难理解了。其实,没这么复杂。前面详细讨论过数组指针的问题,这里的函数指针数组指针不就是一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。仅此而已。下面就定义一个简单的函数指针数组指针:注意,这里的pf和上一节的pf就完全是两码事了。上一节的pf并非指针,而是一个数组名;这里的pf确实是实实在在的指针。这个指针指向一个包含了3个元素的数组;这个数字里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。这比上一节的函数指针数组更拗口。其实你不用管这么多,明白这是一个指针就ok了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆维吾尔自治区奇台县第四中学2024届九年级上学期期末考试数学试卷(含答案)
- 《社会调查方法》课件
- 养老院老人疾病预防措施制度
- 保险精算分类费率课件讲解
- 收物业费保密协议书(2篇)
- 《药品采购》课件
- 《高血压规范化诊治》课件
- 2024年度食用菌产业投资基金销售合同3篇
- 2025年南阳货运上岗证模拟考试题
- 2025年洛阳货运考试题库
- 2025新高考志愿填报规则
- 记录我的一天(教案)-2024-2025学年一年级上册数学北师大版
- 医学教材 《狂犬病暴露预防处置工作规范(2023年版)》解读课件
- 宗地图的图式如下
- 人教版初中八年级上册《信息技术》1.1认识flash和flash动画教学设计信息技术
- 2025年山东省春季高考模拟考试英语试卷试题(含答案+答题卡)
- 五年级上册英语单词表外研
- 检验科降低检测报告超时率PDCA持续改进案例
- 买卖合同法律知识及风险防范培训课件
- 2023年辽宁省水资源管理集团有限责任公司招聘考试真题
- Module 9 Unit2教学设计2024-2025学年外研版英语九年级上册
评论
0/150
提交评论