指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)
一、指针函数
1、解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数。如:
int fun(int x,int y); //这是一个普通函数的声明,返回值是一个int类型,是一个数值。
int *fun(in x,int y); //这就是指针函数,返回值是一个int类型的指针,是一个地址。
2、指针函数的写法:
int *fun(in x,int y);
或int * fun(in x,int y);
或int* fun(in x,int y);
二、函数指针
1、解释:指向数据区域的指针,称为数据指针。指向代码区域的指针称为指向函数的指针,简称函数指针。
函数指针,其本质是一个指针变量,只不过该指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如:
//比较两个string对象的长度
bool lengthCompare(const string &, const string &);
该函数的类型是bool (const string &, const string &)。要想声明一个可以指向该函数的指针,只需要指针替换函数名即可:
bool (*pf) (const string &, const string &); //该指针还未初始化
这句语句的意思是,pf就是一个指向函数的指针,其中该函数的参数是两个const string的引用,返回值是bool类型。
注意:*pf两边的括号必不可少。如果不写这个括号,则pf就是一个返回值为bool指针的函数了,大家可以对比上面的指针函数。
2、函数指针的定义方法:
int (*p)(int , int ); //未初始化
或:int (*p)(int , int ) = q ; //在定义函数指针时初始化,其中q应该与指针p所指向的函数类型相同。
或:int q(int);
int (*p)(int);
p=q;
3、使用函数指针
当我们把函数名作为一个值使用时,该函数自动地转换成指针。例如:按照如下形式我们可以将lengthCompare的地址赋给pf:
pf = lengthCompare; //pf指向名为lengthCompare的函数
pf = &lengthCompare; //同上面等价的赋值语句
此外,我们还可以直接使用函数指针调用该函数(下面三行是等价的):
bool b1 = pf("Hello", "Goodbye");
bool b2 = (*pf)("Hello", "Goodbye");
bool b3 = lengthCompare("Hello", "Goodbye");
注:函数指针本身也是一种数据类型,如:
int (*) (int);
是int (int)型函数的指针类型,其中的“(*)”的括号也是不能省略的。
函数指针的定义形式看起来比较复杂,所以通常采用typedef来简化。例如:
typedef int (*Fun) (int a , int b);
表示声明了一个函数指针类型。注意,此处不是定义函数指针实体。因此:
int m(int , int);
Fun funp = m; //ok
Fun = m; //错
指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)的更多相关文章
- C++-函数与指针的关系(回调函数)
1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...
- callback回调函数理解 相当于this指针
1.callback函数在微软的官方手册中是这样定义callback函数的:“callback函数是由应用程序定义而由操作系统调用的函数”. 凡是由用户设计而却由windows系统调用的函数,统称 ...
- 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针
一.函数原型声明: 1.函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数):函数定义提供了函数的实际主体. 2.强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前 ...
- 《征服 C 指针》摘录4:函数 与 指针
一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可 ...
- 《征服 C 指针》摘录5:函数形参 和 空的下标运算符[]
一.函数的形参的声明 C 语言可以像下面这样声明函数的形参: void func(int a[]) { // ... } 对于这种写法,无论怎么看都好像要向函数的参数传递数组. 可是,在 C ...
- C语言中,数组名作为参数传递给函数时,退化为指针
C语言中,数组名作为参数传递给函数时,退化为指针 C语言中,数组名作为参数传递给函数时,退化为指针:需要数组大小时, 需要一个参数传数组名,另一个传数组大小. 数组名做函数参数时,就相当于指针了. ...
- C++函数的传入参数是指针的指针(**)的详解
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...
- Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度 ...
- C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址
C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当 ...
随机推荐
- bzoj1798 1
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5866 Solved: 2079[Submit ...
- js追加子元素
在页面加载完毕后,向div元素追加span子元素 <html><head><title>js</title><script type=" ...
- centos 6.2 pptp 客户端 安装(转载)
转自:http://www.lnmpblog.com/archives/611 centos 6.2 64.bit的桌面版本.配置vpn客户端. 步骤: 1.yum -y install pptp 2 ...
- Excel -- 实用技巧
一起来学习这45个职场Excel小窍门,轻轻松松提高工作效率,超实用,新技能get! 1.快速填充公式的三种方式 2.最快求和 3.添加文字下面线条的2种方法 4.设置列宽的3种方法 5.以cm为单位 ...
- bzoj 303: [CQOI2009]中位数图【前缀和+瞎搞】
处理出一个序列c,a[i]>b,c[i]=1;a[i]==b,c[i]=0;a[i]<b,c[i]=-1,然后s为c的前缀和,设w为b在a序列里的下标 注意到子序列一定横跨w,并且一个符合 ...
- bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】
考试题搞了好久也没懂-- 正解应该是线性规划 https://www.cnblogs.com/CQzhangyu/p/7894559.html 可是不会写啊 如果从网络流的角度来体会大概是这样 htt ...
- 爬虫—Requests高级用法
Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...
- 11.Flask-钩子函数
在Flask中钩子函数是使用特定的装饰器的函数.为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数. before_first_requ ...
- Tree CodeForces -932D
错误记录:如下注释语句 #include<cstdio> #include<algorithm> using namespace std; typedef long long ...
- git 标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我们想为我们的 runoob 项目发布一个"1.0"版本. 我们可以 ...