c++将函数作为函数参数(函数指针)
如何获取函数的地址
函数名本身就是函数的地址。
假设有一个函数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++将函数作为函数参数(函数指针)相关推荐
- C++函数的传入参数是指针的指针(**)的详解
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...
- mysql不定参数函数_可变参数函数(一)
一个函数可以接受不定数的参数个数,这就是可变参数函数,比较常见的比如printf(),scanf(): printf(const char*format,-); printf("%d&quo ...
- printf 函数使用 可变参数函数实现原理
一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...
- arg是什么函数_不定参数函数实现var_arg系列的宏
电驴的源码日志模块有一个叫 DebugLogError 函数,其签名如下: //代码位于easyMule-master/src/WorkLayer/Log.h 55行void DebugLogErro ...
- 在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。GetStdHandle(参数)函数用于获得句柄
在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数. 参数1:句柄 参数2:颜色 颜色的参数 数值 颜色 0 黑色 1 深蓝色 2 深 ...
- matlab多参数函数,Matlab多参数函数
问题描述: Matlab多参数函数 小弟想用三个变量p.q.s拟合出一条关于y的曲线,已知p.q.s各自关于y的关系(都是二次函数),该如何实现呢? 大侠,好人做到底,送佛送上天,现在我告诉您y=x( ...
- python函数不包括参数函数_python中实现函数不限制参数的数量
我们在写Python代码的时候,有的时候需要设计一种函数,这种函数的参数个数不确定,或者说要求函数的参数不限个数,只有在函数被调用的时候,才能确定参数的数量.本文介绍如何实现这样的函数参数接口的设计. ...
- python中的函数不包括参数函数_在Python中定义函数时不需要声明函数参数的类型。...
的书面申提出员本机关请公务辞职人向任免,定义的类应当月内在(机关)个任免审批. 应通)作过(出确认,函数函数的处到预目的质量期的否达理是事故,依然隐患存在是否. 不正下列确的说法是(,时不声明标文部分 ...
- python中函数不包括参数函数二阶导数公式_请问参数方程确定的函数的二阶导数公式的详细推导过程?...
展开全部 y''=d(dy/dx)/dx=[d(dy/dx)/dt]*(dt/dx) 因变量由y换作dy/dx,自变量还是62616964757a686964616fe58685e5aeb931333 ...
- python中函数不包括参数函数二阶导数公式_参数方程的二阶导数怎么求????...
展开全部 设参数方程 x(t), y(t),则二阶导数: 一阶32313133353236313431303231363533e4b893e5b19e31333431373836导数是自变量的变化率, ...
最新文章
- the server responded with a status of 404 (HTTP/1.1 404 Not Found)
- java 协程_你真的了解kotlin的协程么?
- Python:对字符串匹配算法的分析
- python定义一个类和子类_Python面向对象class类属性及子类用法分析
- CentOS7防火墙firewalld和iptable的设置和使用
- Linux运维学习历程-第五天-Linux文件系统与管理
- postgresql 字符串拼接||“的使用
- 消息推送平台高可用实践(下)
- 对话CDN巨头Akamai:携手金山云,意欲何为?
- 最大连续子序列和的问题
- cropperjs裁剪头像功能实现总结
- c语言瑞年条件,C语言如何判断是闰年,闰年判断条件
- python函数之enumerate()快速打印出列表中的元素以及对应的下标
- bp神经网络算法的优缺点,基于bp的神经网络算法
- Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE
- ISFP——思想起决定作用
- 模拟肯德基KFC快餐店收银系统
- 简单的java实现分解质因数。
- 网站流量排名分析:SEO如何诊断排名不佳的页面!
- sw与matlab连接_solidworks模型如何导入matlab?