函数名与函数指针

上传人:wm****3 文档编号:41932238 上传时间:2018-05-31 格式:DOC 页数:5 大小:44KB
返回 下载 相关 举报
函数名与函数指针_第1页
第1页 / 共5页
函数名与函数指针_第2页
第2页 / 共5页
函数名与函数指针_第3页
第3页 / 共5页
函数名与函数指针_第4页
第4页 / 共5页
函数名与函数指针_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《函数名与函数指针》由会员分享,可在线阅读,更多相关《函数名与函数指针(5页珍藏版)》请在金锄头文库上搜索。

1、函数名与函数指针一一 通常的函数调用通常的函数调用一个通常的函数调用的例子:/自行包含头文件void MyFun(int x); /此处的声明也可写成:void MyFun( int );int main(int argc, char* argv)MyFun(10); /这里是调用 MyFun(10);函数return 0;void MyFun(int x) /这里定义一个 MyFun 函数printf(“%dn”,x);这个 MyFun 函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式 你应该是很熟悉的吧!看主函数中调用 MyFun 函数的书写格式:MyFun(10); 我们

2、一开始只是从功能上或者说从数学意义上理解 MyFun 这个函数,知道 MyFun 函 数名代表的是一个功能(或是说一段代码) 。 直到? 学习到函数指针概念时。我才不得不在思考:函数名到底又是什么东西呢?(不要以为这是没有什么意义的事噢!呵呵,继续往下看你就知道了。 )二二 函数指针变量的声明函数指针变量的声明就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以 存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函 数了。在 C 系列语言中,任何一个变量,总是要先声明,之后才能使用的。那么,函数指针 变量也应该要先声明吧?那又是如何来声明呢?以上

3、面的例子为例,我来声明一个可以指 向 MyFun 函数的函数指针变量 FunP。下面就是声明 FunP 变量的方法:void (*FunP)(int) ; /也可写成 void (*FunP)(int x);你看,整个函数指针变量的声明格式如同函数 MyFun 的声明处一样,只不过?我们 把 MyFun 改成(*FunP)而已,这样就有了一个能指向 MyFun 函数的指针 FunP 了。 (当然, 这个 FunP 指针变量也可以指向所有其它具有相同参数及返回值的函数了。 )三三 通过函数指针变量调用函数通过函数指针变量调用函数有了 FunP 指针变量后,我们就可以对它赋值指向 MyFun,然后

4、通过 FunP 来调用 MyFun 函数了。看我如何通过 FunP 指针变量来调用 MyFun 函数的:/自行包含头文件void MyFun(int x); /这个声明也可写成:void MyFun( int );void (*FunP)(int ); /也可声明成 void(*FunP)(int x),但习惯上一般不这样。int main(int argc, char* argv)MyFun(10); /这是直接调用 MyFun 函数FunP= /将 MyFun 函数的地址赋给 FunP 变量(*FunP)(20); /这是通过函数指针变量 FunP 来调用 MyFun 函数的。void M

5、yFun(int x) /这里定义一个 MyFun 函数printf(“%dn”,x);请看黑体字部分的代码及注释。 运行看看。嗯,不错,程序运行得很好。哦,我的感觉是:MyFun 与 FunP 的类型关系类似于 int 与 int *的关系。函数 MyFun 好像是一个如 int 的变量(或常量) ,而 FunP 则像一个如 int *一样的指针变量。int i,*pi;pi= /与 FunP= void (*FunP)(int ); /声明一个用以指向同样参数,返回值函数的指针变量。int main(int argc, char* argv)MyFun(10); /这里是调用 MyFun(

6、10);函数FunP=MyFun; /将 MyFun 函数的地址赋给 FunP 变量FunP(20); /这是通过函数指针变量来调用 MyFun 函数的。return 0;代码之二:void MyFun(int x) /这里定义一个 MyFun 函数printf(“%dn”,x);我改了黑体字部分(请自行与之前的代码比较一下) 。运行试试,啊!一样地成功。咦?FunP=MyFun;可以这样将 MyFun 值同赋值给 FunP,难道 MyFun 与 FunP 是同一数据类型(即如同 的 int 与 int 的关系) ,而不是如同 int 与 int*的关系了?(有没有一点点的糊涂了?)看来与之前

7、的代码有点矛盾了,是吧!所以我说嘛!请容许我暂不给你解释,继续看以下几种情况(这些可都是可以正确运行的代码哟! ):代码之三:int main(int argc, char* argv)MyFun(10); /这里是调用 MyFun(10);函数FunP= /将 MyFun 函数的地址赋给 FunP 变量FunP(20); /这是通过函数指针变量来调用 MyFun 函数的。return 0;代码之四:int main(int argc, char* argv)MyFun(10); /这里是调用 MyFun(10);函数FunP=MyFun; /将 MyFun 函数的地址赋给 FunP 变量(*

8、FunP)(20); /这是通过函数指针变量来调用 MyFun 函数的。return 0;真的是可以这样的噢!(哇!真是要晕倒了!)还有呐!看? 代码之五:int main(int argc, char* argv)(*MyFun)(10); /看,函数名 MyFun 也可以有这样的调用格式return 0;你也许第一次见到吧:函数名调用也可以是这样写的啊!(只不过我们平常没有这样 书写罢了。 )那么,这些又说明了什么呢?呵呵!依据以往的知识和经验来推理本篇的“新发现” ,我想就连“福尔摩斯”也必 定会由此分析并推断出以下的结论:1. 其实,MyFun 的函数名与 FunP 函数指针都是一样的

9、,即都是函数指针。MyFun 函 数名是一个函数指针常量,而 FunP 是一个函数数指针变量,这是它们的关系。2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习 惯的。所以 C 语言的设计者们才会设计成又可允许 MyFun(10);这种形式地调用(这样方便 多了并与数学中的函数形式一样,不是吗?) 。3. 为统一起见,FunP 函数指针变量也可以 FunP(10)的形式来调用。4. 赋值时,即可 FunP= /不能写成 void (*MyFun)(int )。void (*FunP)(int ); /不能写成 void FunP(int )。(请看注释)

10、这一点是要注意的。五五 定义某一函数的指针类型:定义某一函数的指针类型:就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型 来声明函数指针变量。我先给你一个自定义数据类型的例子。typedef int* PINT; /为 int* 类型定义了一个 PINT 的别名int main()int x;PINT px= /与 int * px=是等价的。PINT 类型其实就是 int * 类型*px=10; /px 就是 int*类型的变量 return 0;根据注释,应该不难看懂吧!(虽然你可能很少这样定义使用,但以后学习 Win32 编程时会经常见到的。 )下面我们来看一下

11、函数指针类型的定义及使用:(请与上对照!)/自行包含头文件void MyFun(int x); /此处的声明也可写成:void MyFun( int );typedef void (*FunType)(int ); /这样只是定义一个函数指针类型FunType FunP; /然后用 FunType 类型来声明全局 FunP 变量int main(int argc, char* argv)/FunType FunP; /函数指针变量当然也是可以是局部的 ,那就请在这里声明了。 MyFun(10); FunP= (*FunP)(20); return 0;void MyFun(int x) pri

12、ntf(“%dn”,x);看黑体部分:首先,在 void (*FunType)(int ); 前加了一个 typedef 。这样只是定义一个名为 FunType 函数指针类型,而不是一个 FunType 变量。然后,FunType FunP; 这句就如 PINT px;一样地声明一个 FunP 变量。其它相同。整个程序完成了相同的事。这样做法的好处是:有了 FunType 类型后,我们就可以同样地、很方便地用 FunType 类型来声明多个同类 型的函数指针变量了。如下:FunType FunP2;FunType FunP3;/六 函数指针作为某个函数的参数既然函数指针变量是一个变量,当然也可

13、以作为某个函数的参数来使用的。所以,你 还应知道函数指针是如何作为某个函数的参数来传递使用的。给你一个实例:要求:我要设计一个 CallMyFun 函数,这个函数可以通过参数中的函数指针值不同来 分别调用 MyFun1、MyFun2、MyFun3 这三个函数(注:这三个函数的定义格式应相同) 。实现:代码如下:/自行包含头文件 void MyFun1(int x); void MyFun2(int x); void MyFun3(int x); typedef void (*FunType)(int ); /. 定义一个函数指针类型 FunType,与函数类型一至void CallMyFun(

14、FunType fp,int x);int main(int argc, char* argv)CallMyFun(MyFun1,10); /. 通过 CallMyFun 函数分别调用三个不同的函数CallMyFun(MyFun2,20); CallMyFun(MyFun3,30); void CallMyFun(FunType fp,int x) /. 参数 fp 的类型是 FunType。fp(x);/. 通过 fp 的指针执行传递进来的函数,注意 fp 所指的函数是有一个参数的void MyFun1(int x) / . 这是个有一个参数的函数,以下两个函数也相同printf(“函数 MyFun1 中输出:%dn”,x);void MyFun2(int x) printf(“函数 MyFun2 中输出:%dn”,x);void MyFun3(int x) printf(“函数 MyFun3 中输出:%dn”,x);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号