函数指针就是指向函数的指针,和其他指针一样,函数指针也有类型

函数指针的类型由函数的返回值和函数的形参共同决定,与函数名无关,因为只是个名字

比如,函数的声明如下:

int funcpointer(double d, string str);

那么函数的类型就是int(double, string),所以函数指针就是int (*pf)(double, string)

函数指针的读法依然是先中间,然后两边,

先看到pf和*,知道这是个指针,看到右侧的(double, string),知道这是形参列表,从而了解该指针指向了一个函数,最后看左边int,知道指向的函数返回值是int

pf两边的括号必不可少,如果没有,那么pf就是函数名,返回一个int型指针

函数指针的初始化和赋值

可以直接用函数名给函数指针赋值或初始化,或者在函数名前面加上取地址符号

void testfuncp()
{int(*pf)(double, string)=funcpointer;int(*pf2)(double,string);pf2=funcpointer;pf(3.14, "asd");*pf2(2.2,"qwe");
}int funcpointer(double d, string str)
{cout<<__func__<<endl;
}

以上代码还显示,可以通过函数指针直接调用函数,而不用解引用,当然,用了解引用符也没什么

当给一个函数指针赋值或者初始化时,函数类型必须匹配,否则报错

void testfuncperror()
{int(*pf)(double, string)=testfuncp;
}void testfuncp()
{int(*pf)(double, string)=funcpointer;int(*pf2)(double,string);pf2=funcpointer;pf(3.14, "asd");pf2(2.2,"qwe");
}

函数指针的作为形参

函数指针作为形参时,传入的函数会被当做指针处理

int main(int argc, char const *argv[])
{testfuncpointerpara(twointfunc);return 0;
}void testfuncpointerpara(void (*pf)(int, int))
{cout<<__func__<<endl;pf(10,20);
}void twointfunc(int a, int b)
{cout<<__func__<<endl;
}

返回函数指针

返回函数指针的函数可以按照如下方式进行声明

int (*returnfuncpointer(int a, int b))(int c, int d);

读法依然是先中间,再右,最后左

看中间*returnfuncpointer(int a, int b),知道returnfuncpointer是一个函数,返回的是指针,再看右边有形参列表,知道返回的是函数指针,最后看左边int,知道这个函数指针的指向的函数的返回值是int

int main(int argc, char const *argv[])
{int a=10,b=20;int (*pf)(int, int)=returnfuncpointer(a,b);pf(a,b);return 0;
}int (*returnfuncpointer(int a, int b))(int c, int d)
{cout<<__func__<<endl;return func;
}int func(int a, int b)
{cout<<a+b<<endl;return a+b;
}

上述代码中的函数returnfuncpointer返回一个类型为int (*)(int a, int b)的函数指针,首先用该函数的返回值初始化pf,然后通过pf调用函数func

参考:

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点10——函数指针相关推荐

  1. rust(10)-函数指针

    PS F:\learn\rustlearn> rustc learn1.rs PS F:\learn\rustlearn> .\learn1.exe 0.6823278038280194 ...

  2. 函数指针、函数指针数组,函数指针数组的指针

    数组指针 概念:数组指针是指针,只要是指针他就占4个字节: 例如: 整形指针:int *p;能够指向整形数据的指针 浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就 ...

  3. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  4. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  5. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  6. C语言程序设计 | 指针的进阶(一):字符指针、数组指针、指针数组、函数指针

    指针的进阶(一)目录: 字符指针 数组指针和指针数组 函数指针 字符指针 在开始讲解这一章节之前,我们需要了解指针前面声明的类型的意义 类型 * 指针名 对于指针来说,我们在给指针进行声明时,我们声明 ...

  7. 函数指针及其的运用(上)——何为函数指针

    =========================引子========================= 我们都知道,数组名就是指向数组第一个元素的常量指针(详见<数组拾遗>).同理,对于 ...

  8. 指针 数组指针 指针数组 函数指针等说明。

    指针的概念 原文地址:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html 指针是一个特殊的变量,它里面存储的数值被解释成为 ...

  9. 类的成员函数指针(比较深入)

    From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块讲解的比较深入详细 推荐阅读 / 先 ...

最新文章

  1. Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
  2. 2011下半年案例分析题的解答思路_信息系统项目管理师考试
  3. System.getProperty()的用途
  4. 服务器u8系统数据库不存在,用友u8服务器端数据库不装
  5. vConsole 让你在手机上也能轻松调试网页
  6. java接口fastjson_走进Java接口测试之fastjson指南
  7. Flask的Rsponse响应对象
  8. html 标签 anki,为什么不建议使用Anki模板里的标签?
  9. 《C++ Primer Plus》读书笔记之七—内存模型和名称空间
  10. centos-rpm
  11. pr如何处理音效_PR剪辑如何让视频声音更好听
  12. TARA-基于J3061的概念阶段流程
  13. 由于找不到MSVCR100.dll,无法继续执行代码解决方法
  14. python输入负数_如何让python使用负数
  15. 使用工具Android Studio实现一个简单的Android版的新闻APP
  16. AR小游戏 牧师与恶魔
  17. C#Base64编码
  18. 伟景行citymaker-----01.javascript打开本地模型CEP,加载目录树,加载要素类
  19. 戴隐形眼镜好吗 隐形眼镜能经常戴吗
  20. Mac系统安装JDK1.8及环境变量配置

热门文章

  1. 实现entity、dao 、service 、serviceImpl自动生成
  2. Java I/O演进与Linux网络I/O模型
  3. Qlikview 的服务器
  4. 使用Latex排版一篇IEEE文章
  5. Spark源码学习之IDEA源码阅读环境搭建
  6. 解决写入InfluxDB时,报unbalanced quotes的问题
  7. Luogu5369 [PKUSC2018]最大前缀和
  8. python开发线程:线程守护线程全局解释器锁
  9. LeetCode-Reverse Integer
  10. Android View体系(十)自定义组合控件