与数据项类似,函数也有地址。函数的地址是存储其机器语言代码的内存开始的地方。

一、函数指针的基础知识

假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都使用该函数,并且该函数允许每个程序员提供自己的算法来估计时间。为实现这种目标,采用的机制是,将程序员要使用的算法函数地址传给estimate(),必须完成以下工作:

  • 获取函数地址
  • 声明一个函数指针
  • 用函数指针来调用函数

1.获取函数地址

使用函数名(后面不跟参数)即可。如:think()是一个函数,则think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。

一定要注意区分传递的是函数的地址还是函数的返回值:

1 process(think);    //传递函数think()的地址给process()
2 thought(think()); //传递函数think()的返回值给though()

2.声明函数指针

声明应指定指针所指向的函数的返回类型以及函数的特征标(参数列表),假设Pam编写了一个估算时间的函数,其原型如下:

1 double pam(int);    // 函数声明

则正确的指针类型声明如下:

1 double (*pf) (int);
2 // pf指向一个输入一个int参数,返回一个double值得函数

可以看出,就是将函数声明中的函数名替换为*pf, 于是pf就成为指向函数的指针,由指针的基本知识可以知道,(*pf)也是函数。

必须在声明中用括号将*pf括起,否则如下:

1 double *pf(int);

这相当于声明了一个函数pf,它的返回值是一个指向double的指针,与我们想要声明的函数指针完全不是一码事。

正确声明pf之后,便可以将相应的函数地址赋给它:

1 double pam(int);
2 double (*pf)(int);
3 pf = pam;

现在指针pf就指向函数pam()了。再次强调pam()的特征标和返回类型必须与pf相同。

假设现在要将编写的代码行数和估算算法(如pam()函数)的地址传递给estimate(),原型如下:

1 void estimate(int lines, double (*pf)(int));

要让estimate()使用pam()函数,需要将pam()的地址传给它:

1 estimate(50, pam);

3.使用指针来调用函数

上面讲过,(*pf)扮演的角色与函数名相同,因此使用(*pf)时,只需将它看作函数名即可:

1 double pam(int);
2 double (*pf)(int);
3 pf = pam;
4 double x = pam(4);   // 用函数名调用函数
5 double y = (*pf)(5);  // 用指针pf调用函数

但是,C++也允许像使用函数名那样使用pf:

double y = pf(5);  //与double y = (*pf)(5)效果一样

为何pf与(*pf)等价呢?因为存在两种看法,一种学派认为,由于pf是函数指针,而*pf是函数,因此应将(*pf)()用作函数调用;而另一种学派认为,由于函数名是指向该函数的指针,指向函数指针的行为应与函数名相似,因此应将pf()用作函数调用。看上去都是合理的说法,因此C++进行了折衷--两种方法都正确,虽然在逻辑上相互冲突。

二、函数指针示例

 1 /*函数指针示例*/
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 //将会被调用的两个函数的声明
 7 double betsy(int);
 8 double pam(int);
 9
10 //estimate()声明
11 void estimate(int lines, double (*pf)(int));
12
13 int main()
14 {
15     int code;
16
17     cout << "请输入代码行数:";
18     cin >> code;
19     cout << "Betsy的评估结果:\n";
20     estimate(code, betsy);
21     cout << "Pam的评估结果:\n";
22     estimate(code, pam);
23     return 0;
24 }
25
26 double betsy(int lns)
27 {
28     return 0.05 * lns;
29 }
30
31 double pam(int lns)
32 {
33     return 0.03 * lns + 0.0004 * lns * lns;
34 }
35
36 void estimate(int lines, double (*pf)(int))
37 {
38     cout << lines << "行代码将耗时 ";
39     cout << (*pf)(lines) << " 小时\n";
40 }

运行结果:

转载于:https://www.cnblogs.com/90zeng/p/Cpp_function_pointer.html

C++学习笔记之函数指针相关推荐

  1. 【C语言学习笔记】函数指针的定义和用法

    函数指针的定义和用法 先回顾下数组的储存方式,当你在程序中定义了一个数组,那么系统就会自动根据你的数组类型和数组长度申请一块储存空间给你.而且数组名储存的地址刚好就是申请的这块储存空间的首地址,这也是 ...

  2. Python学习笔记12_函数

    Python学习笔记12_函数 文章目录 Python学习笔记12_函数 1.函数定义 2.函数调用 3.函数的参数 3.1.可更改对象和不可更改对象参数 3.2.必需参数(位置参数) 3.3.关键字 ...

  3. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  4. Python学习笔记:函数(Function)

    Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...

  5. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  6. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  7. JAVA学习笔记五---函数

    JAVA学习笔记五---函数 5.1 方法的学习 编写一个程序,求圆的周长和面积. package practice; /*** 编写一个程序,求圆的周长和面积.* @author iszhangyo ...

  8. MySQL学习笔记—自定义函数

    MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如 ...

  9. matlab机器人工具箱学习笔记——ikine函数

    matlab机器人工具箱学习笔记--ikine函数 ikine函数用法 使用实例 链接: https://blog.csdn.net/weixin_42596724/article/details/8 ...

最新文章

  1. 工业传感器:工业互联网的第一道门
  2. TCP层,flags字段标识位含义说明
  3. php 实现同一个账号同时只能一个人登录
  4. plsql 设置鼠标行执行_如何制作键盘鼠标产品质量合格证
  5. Hadoop大数据平台环境搭建注意事项,分布式数据采集,武汉数道云科技
  6. 元素显示模式转换(HTML、CSS)
  7. 牛客小白月赛6 A 鲲
  8. Mac配置adb笔记,彻底解决zsh: command not found: adb问题
  9. 个人财务管理系统mysql_个人财务管理系统功能模块设计
  10. SVN Server使用说明
  11. 考查频率最高的吉林八景
  12. HTML5浏览器兼容性解决方案
  13. 微盟致远OA聚水潭YonSuite系统对接集成整体解决方案
  14. 使用批处理批量安装TCP/ip打印机
  15. 重采样 上采样 下采样
  16. MyBatis 一个动态sql的问题(动态SQL基于OGNL表达式)<if test=“state == ‘0‘“>单个的字符要使用双引号,改为<if test=‘state == “1“‘>或
  17. 成长中的SEO,应该避免这12个过时的优化策略(转载自:https://www.duiji.net)
  18. 认识计算机微课导学单,微课“任务单”与“导学案”之比较
  19. 10. 正则表达式与JSON
  20. pc端的企业网站(IT修真院test8)详解1-1

热门文章

  1. B/S项目结束,又是一个新的开始
  2. 技术网站 --人人都是产品经理
  3. 利用HTTP Cache来优化网站
  4. Permission is only granted to system app
  5. 输入框中默认的值,判断是否输入内容
  6. Eclipse 每行 79 字符限制的提示线
  7. 算法时间复杂度lg是多少_时间复杂度入门理解
  8. layui与eazyui的区别_jquery easyui和layui的区别是什么?
  9. access订单明细表怎么做_成本明细表
  10. 互联网协议 — SCTP 流控制传输协议