函数指针的用法

函数指针的用法

概要:本文描述的函数指针的一些使用方法。

关键字:函数指针、返回函数指针的函数

 

提到函数指针,一般我们能够想到的用法如下。

 

1、 第一种,直接使用,比较原始的方式。


 

 

说明:首先,我们定义一个函数指针变量pFun,函数的原型是:int (*)(int n)即,该函数是一个参数为整形,返回值是空值的函数。请注意我在这里使用的措辞,pFun是一个“变量”,而非“类型”,那么,既然是变量,它就应该能够被赋值,能够被初始化。因此,由于函数testFun1的参数与返回值与上面所描述的类型吻合,所以我们能够对pFun进行赋值pFun = testFun1。然后使用函数指针进行调用,(*pFun)(1)。为什么可以这么调用呢?我们需要理解:函数的函数名本质上就是一个指针,函数名指向该函数在内存中的首地址。就像int array[10]array就能代表数组首地址一样。所以,表达式(*pFun)(1)表达的意思是先取pFun的值,得到testFun1的地址,然后再进行调用,与直接调用testFun1(1)没有任何区别。

pFun(1)又是怎么回事,为什么也能够进行调用?为什么与(*pFun)(1)表达同一个意思?

以下说明解释了为什么?在这里引用了一位达人的链接,膜拜先,同时也灰肠感谢这位达人的文字指点。

http://blog.21ic.com/user1/3742/archives/2007/34818.html

 

 

 

如果你看明白了上面的描述,那么应该很清楚的知道为什么了。呵呵。

 

2、 第二种,使用typedef的方式。

先说明一下typedef的作用,该关键字的目的是将一个已知的类型定义成一个新的类型,使用新的类型可能会具有更加明确的语义,或者使用更加方便。

如:typedef int INT; INT n = 100;

这种方式是如下定义的。

 

 

 

说明:这种方式与第一种唯一不同的就是使用了typedef,它为函数的原型为:int (*)(int n)的类型定义了一个新的名字(或称为类型),叫FUN,使用FUN定义一个变量pFunpFun就能代表一个函数指针,代表的函数原型就是int (*)(int n)pFun既然是一个变量,那么其使用也就和前面所述的第一种方式无异了,这里不再赘述。

 

3 第三种,在类中使用函数指针。

 

指针的定义加上了“类”限制, 指针的使用加上了的“对象”限制,用来指明指针指向的函数是哪个类的, 使用的时候是对象相关的.

个人感觉在类中使用函数指针没有一点用处, 至少我现在不知道有啥用途. 


直到我在阅读《STL源码剖析》之前,我一直认为函数指针的使用方式也就只有这么多,但今天在读这本书的时候,发现了以下奇怪的用法,见书:P57页,代码如下:

 

 

 

乍一看,不对呀,void ( *set_malloc_handle(void (*f)()) ) ()这个定义明明是返回一个空值啊,为什么返回的是一个函数指针,难道书出错了?google了一下,终于明白是怎么回事。原来函数指针还可以这么用。

 

4、 第四种,定义返回函数指针的函数

return_type ( *function(func_parameter_list) ) (parameter_list)

 

说明:这里定义了一个函数function,该函数的参数列表是(func_patameter_list),返回类型是一个函数指针,这个函数指针的原型是return_type (*)(parameter_list)

 

得之这种使用方式后,上面的源代码我们就能够明白到底是怎么回事了。

 

因此:void ( *set_malloc_handle(void (*f)()) ) ()这个定义就是说,定义了一个函数set_malloc_handle,其参数是一个函数指针f,其原型是void (*)(),函数set_malloc_handle的返回值也是一个指针,其原型也是void (*)(),函数内部先将旧的函数指针保存起来,然后设置新的函数指针,最后将旧的函数指针返回出去。一目了然。

 

实际上,按照这种方式,看着总归有些别扭,感觉语义晦涩难懂,无非就是一个函数,它即能够接收一个函数指针,又能够返回一个函数指针,因此,完全可以按照以下方式来做:

 

 

 

这样看起来是不是更加清晰了呢?呵呵。实际上,我查看了一下windowsSTL版本里面的定义,就是按照这种方式。代码如下:

 

 

 

再看一个例子,以前我在刚学linux信号的时,没怎么搞明白,现在也一目了然了。

signal函数原型

 

 


本文参考链接:

1.  关于C++中函数指针的使用:

http://www.98exe.net/Article/a/2006-10-23/2025.html

2.  函数指针及其应用:

http://blog.21ic.com/user1/3742/archives/2007/34818.html

3.  定义返回函数指针的函数:

http://dev.firnow.com/course/3_program/c++/cppjs/20091012/178580.html

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值