指针函数(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++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当 ...
随机推荐
- Luogu P1638 逛画展 【二分答案】
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看 ...
- jquery中document.ready在两类浏览器中的区别[转]
DOMready的构建方法不再重复,现代浏览器通过DOMContentLoaded来实现,IE通过readystatechange+doScroll来模拟该方法. 类似jquery中的document ...
- [ZJOI2011]道馆之战
Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个 ...
- C# 操作Access的Ole对象[转]
原文链接 OLE对象数据类型 (1)OLE 对象用于使用 OLE 协议在其他程序中创建的 OLE 对象,如 Microsoft Word 文档. Microsoft Excel 电子表格.图片.声音或 ...
- java数组实现买彩票(重复则重新遍历查询思想)
package com.wh.shuzu; import java.util.Arrays; /** * 买彩票 * @author 丁璐同学 * 重复则重新遍历查询思想 */ public clas ...
- OC中protocol、category和继承的关系--转
开放封闭原则(OCP)就是,“对扩展开放,对更改封闭”.是所有面向对象设计的一个核心宗旨.感兴趣的可以看百度百科的一些解释:http://baike.baidu.com/view/2493421.ht ...
- 1270 数组的最大代价 dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况, ...
- HBase Region Assign流程详解
Hbase是kv存储,但是逻辑上我们可以把存储在hbase上的kv数据当成表,rowkey可以认为是表的主键.为了便于分布式操作,hbase会把表横向切分成一块一块的数据,而每块就是一个Region. ...
- JS filters-ul li简单过滤
功能要求:在input中输入字母,显示ul li中匹配的元素,隐藏不匹配的 <!DOCTYPE html> <html> <head> <meta chars ...
- react学习文档
转自http://www.ruanyifeng.com/blog/2015/03/react.html,阮一峰老师的博客. 最近想学习react,官方文档的例子不是那么浅显易懂,看了相关博客,觉得阮一 ...