函数指针的定义与使用
2016-01-27 17:21
225 查看
简单的函数指针
如果从指针的层面上理解函数,那么函数的函数名实际上就是一个指针,指向该函数的代码在内存中的首地址。声明函数指针:返回类型(*函数名)(参数表)
下面举一个函数指针的小例子:
int (*funcptr)(int); int f(int a) { return a; } funcptr=f; (*funcptr)(2); //也可以写成funcptr(2)
关于调用函数指针时加不加*的讨论,附上一个比较不错的观点:调用函数指针时加不加星号?
在实际应用中,通常用typedef定义函数指针:
typedef 返回类型(*新类型)(参数表)
与typedef其它应用场合一样,可以用定义的“新类型”来定义函数指针。
typedef int (*FUNCPTR)(int); FUNCPTR funcptr; int f(int a) { return a; } funcptr=f; (*funcptr)(2);
相信有读者看到这里会发出一个疑问:用typedef定义函数指针类型的时候,为什么不是正常的“类型在左,别名在右”的顺序呢?当然,这也是我学习函数指针时一个疑惑的地方,于是在网上找到了一篇解释的还算合理的博客梁欢,下面是从中选取的一些内容:
typedef是C/C++中用于为现有类型创建更有意义的别名的关键字。对于普通类型来说,类型在左,别名在右:
typedef int size;
如果函数指针的定义也符合这种样式,那么下面下这样定义才是合理的:
typedef void(*)(int) Type;
但实际上编译器采用的是如下的定义方式(以上的代码编译不过去的):
typedef void(*Ptr)(int);
同样的还有对数组的重命名(本来应该是“
typedef char[81] Line;”形式的,但由于同样的原因不能这样做):
typedef char Line[81];
至于是不是编译器在技术实现上前一种比较困难,我就不得而知了。
C++类中函数指针的使用
定义形式:typedef 返回类型(类名::*新类型)(参数表)
class CA { public: void lcFunc(int a){ cout << "hello" << endl;} }; CA ca; typedef void (CA::*PTRFUN)(int); //定义类成员函数指针类型 PTRFUN pFun; void main() { pFun = &(CA::lcFunc); //获得类成员函数首地址 (ca.*pFun)(2); //注意括号的位置ca.*pFunc }
注: 不要混淆指针函数和函数指针。
指针函数指的是:一个函数返回时不仅可以带回一个整型数据的值,字符类型和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。(小甲鱼C++视频)简单来讲,就是函数返回一个指向某一类型数据的指针,该指针指向的数据为堆内存数据,在函数内部动态申请。
即指针函数为一种函数,函数指针为一种指针。
相关文章推荐
- Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结
- ios自动打包(适用于批量打包)
- 批量删除pdf文档中的注释(是一个网址列表)
- 第 8 章 CSS 代码缩写,占用更少的带宽
- Android Studio系列教程四--Gradle基础
- 10029--- I/O 基础之缓冲区
- 1.27 python21行代码拼写检测 50行代码检测语言
- java中栈内存和堆内存的区别
- JavaScriptCore 简介
- 数据sql
- 在64位Win7操作系统中安装Microsoft Access Engine的解决方案
- Git学习序列2 --- 版本库(Repository)
- C Primer Plus10-6
- Android自己定义组件系列【7】——进阶实践(4)
- Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结
- Android 项目的优化
- POJ 2763 Housewife Wind(LCA)
- 字符,字符串,字符数组,指针的混合运用
- HDU 5584 LCM Walk(number theory && GCD)
- 少年火车“方便”没带纸 发Twitter求助竟获救