如何获取函数的地址

函数名本身就是函数的地址。

假设有一个函数think(),则think就是该函数的地址。

要将函数作为参数进行传递,必须传递函数名

process(think);          //传递的是函数地址
process(think());       //传递的是函数的返回值

声明函数指针

在声明指向函数的指针时,要声明指针指向的函数的类型,即声明应指定函数的返回值类型和参数列表。

假设有一函数,原型如下:double pam(int);

则正确的指针声明如下:double (*pt)(int)

其中,(*pt)是函数,pt是函数指针。

在正确的声明了指针之后,我们就可以将相应的函数的地址赋给它:

pt=pam

使用指针来调用函数

前面指出,(*pt)是函数,与pam作用相同,因此使用的时候直接将它看作函数名即可。

double pam(int);
double (*pt)(int);
pt=pam;
double x=pam(10);
double y=(*pt)(10);
double z=pt(10);       //also valid

例子

假设我们需要设计一个名为estimate()的函数,用来计算运行指定行数代码所需要的时间,其中的算法由程序员自己设计决定。

假设程序员设计了两种计算时间的算法,分别为pam()betsy(),其定义如下:

double pam (int lens){return lens*1.5;
}double betsy(int lens){return lens*2.0;
}

则函数estimate()直接将上面两个函数作为参数,使用如下格式:

estimate(pam,code);
estimate(betsy,code);

而函数estimate()的声明和定义如下:

void estimate(double (*pf)(int),int lens){cout<<lines<<"lines will take:";cout<<(*pf)(lens)<<"hours";
}

其中,pf是指向函数的指针,(*pf)就是调用传进来的函数参数。

深入探讨函数指针

假设有下面这些函数原型,他们的参数列表和返回值类型都是相同的。

const double *f1(const double ar[],int n);
const double *f2(const double [],int n);
const double *f3(const double *,int n);         //在函数原型中可以省略标识符ar

如果要声明一个指针p1,指向上面三个函数之一,则声明如下:

const double *(*p1)(const double *,int)=f1;     //声明的同时初始化

也就是将函数名f1换成了(*p1)。

使用C++11的自动类型推断功能,代码要简单的多:

auto p2=f2;

也可以声明一个指针数组,同时初始化:

const double *(*pa[3])(const double *,int)={f1,f2,f3};

注意,此时不可以使用auto进行声明,因为auto只能用于单值初始化。

但是声明完pa后,可以用auto声明同样类型的数组:auto pb=pa;

用typedef进行简化

可以使用typedef在程序的开头为函数指针声明一个别名:

typedef const double *(*p_fun)(const double *,int);
//使用p_fun别名来简化代码
p_fun p1=f1;
p_fun pa[3]={f1,f2,f3};

参考资料

C++ Primer Plus 第六版 中文版

c++将函数作为函数参数(函数指针)相关推荐

  1. C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...

  2. mysql不定参数函数_可变参数函数(一)

    一个函数可以接受不定数的参数个数,这就是可变参数函数,比较常见的比如printf(),scanf(): printf(const char*format,-); printf("%d&quo ...

  3. printf 函数使用 可变参数函数实现原理

    一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...

  4. arg是什么函数_不定参数函数实现var_arg系列的宏

    电驴的源码日志模块有一个叫 DebugLogError 函数,其签名如下: //代码位于easyMule-master/src/WorkLayer/Log.h 55行void DebugLogErro ...

  5. 在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。GetStdHandle(参数)函数用于获得句柄

    在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数. 参数1:句柄 参数2:颜色 颜色的参数 数值 颜色 0 黑色 1 深蓝色 2 深 ...

  6. matlab多参数函数,Matlab多参数函数

    问题描述: Matlab多参数函数 小弟想用三个变量p.q.s拟合出一条关于y的曲线,已知p.q.s各自关于y的关系(都是二次函数),该如何实现呢? 大侠,好人做到底,送佛送上天,现在我告诉您y=x( ...

  7. python函数不包括参数函数_python中实现函数不限制参数的数量

    我们在写Python代码的时候,有的时候需要设计一种函数,这种函数的参数个数不确定,或者说要求函数的参数不限个数,只有在函数被调用的时候,才能确定参数的数量.本文介绍如何实现这样的函数参数接口的设计. ...

  8. python中的函数不包括参数函数_在Python中定义函数时不需要声明函数参数的类型。...

    的书面申提出员本机关请公务辞职人向任免,定义的类应当月内在(机关)个任免审批. 应通)作过(出确认,函数函数的处到预目的质量期的否达理是事故,依然隐患存在是否. 不正下列确的说法是(,时不声明标文部分 ...

  9. python中函数不包括参数函数二阶导数公式_请问参数方程确定的函数的二阶导数公式的详细推导过程?...

    展开全部 y''=d(dy/dx)/dx=[d(dy/dx)/dt]*(dt/dx) 因变量由y换作dy/dx,自变量还是62616964757a686964616fe58685e5aeb931333 ...

  10. python中函数不包括参数函数二阶导数公式_参数方程的二阶导数怎么求????...

    展开全部 设参数方程 x(t), y(t),则二阶导数: 一阶32313133353236313431303231363533e4b893e5b19e31333431373836导数是自变量的变化率, ...

最新文章

  1. the server responded with a status of 404 (HTTP/1.1 404 Not Found)
  2. java 协程_你真的了解kotlin的协程么?
  3. Python:对字符串匹配算法的分析
  4. python定义一个类和子类_Python面向对象class类属性及子类用法分析
  5. CentOS7防火墙firewalld和iptable的设置和使用
  6. Linux运维学习历程-第五天-Linux文件系统与管理
  7. postgresql 字符串拼接||“的使用
  8. 消息推送平台高可用实践(下)
  9. 对话CDN巨头Akamai:携手金山云,意欲何为?
  10. 最大连续子序列和的问题
  11. cropperjs裁剪头像功能实现总结
  12. c语言瑞年条件,C语言如何判断是闰年,闰年判断条件
  13. python函数之enumerate()快速打印出列表中的元素以及对应的下标
  14. bp神经网络算法的优缺点,基于bp的神经网络算法
  15. Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE
  16. ISFP——思想起决定作用
  17. 模拟肯德基KFC快餐店收银系统
  18. 简单的java实现分解质因数。
  19. 网站流量排名分析:SEO如何诊断排名不佳的页面!
  20. sw与matlab连接_solidworks模型如何导入matlab?

热门文章

  1. 期权希腊字母更多的含义和解释
  2. 互联网数据挖掘与分析讲解
  3. 编写shell脚本运行python文件
  4. WIN7下网络共享设置
  5. 固态硬盘正确分区方法,好用的硬盘分区工具
  6. 森浦资讯是一家怎么样的公司
  7. JVM垃圾回收——三色标记法
  8. 高可用架构的6大常规方案【转】
  9. 音视频开发之旅(67) - 变速不变调之sonic源码分析
  10. Android开发最近新闻和功能都在这里了