前言:函数
函数也有地址, 函数的地址时存储其机器语言代码(即二进制的字节码)的内存的开始地址.一般, 这鞋地址对用户而言, 既不重要, 也没有什么用, 可是对程序却颇有用指针
当知道地址以后, 就能够声明指针, 指针就能够指向函数的地址, 有了地址和指针, 就能够将函数的指针传做为参数传递给另外一个函数.内存
与直接调用另外一个函数不一样的是, 它容许在不一样的时间传递不一样的函数地址. 这意味着能够在不一样得时间使用不一样的函数.原型
当咱们要将函数的地址 做为参数 传给另一个函数时, 须要有如下三个条件才能达到要求:class
1. 获取函数的地址.二进制
2. 声明一个函数的指针.程序
3. 使用指向函数的指针来调用函数.方法
一. 获取地址数据
方法: 直接使用函数名, 不跟任何参数. 语言
例:
有一个函数名为think(), 则 think 就是函数的地址., 做为参数传递时, 直接传递函数名就能够, 如:
process(think)
二. 声明函数指针
声明函数的指针时, 和其余声明其余类型的指针同样, 都须要先肯定 这个指针是指向哪一类型数据的指针,
而函数指针特殊的是, 一方面要指定返回类型, 一方面要指定函数的特征标(形式参数列表)
例如如下一个估算时间的函数, 原型以下:
double pam(int) ;
则该函数的对应指针应为:
double (*pf) (int);
返回值 函数名 参数列表
仔细观察发现, 函数指针与函数原型的惟一区别就是, 将函数名pam 改成了(*pf)
即 pam=(*pf)
pam是一个函数, (*pf) 也就是函数
(*pf) 是函数, 那么pf就是函数的指针;
正确声明以后, 就能够进行赋值
pf = pam;
若是指针与函数原型不匹配, 没法成功赋值
成功赋值后, 便可调用
前面说过, (*pf)=pam
因此调用时, 直接将(*pf) 看作pam直接进行替换就行
(*pf)(5)
实际上, C++ 也容许不加*号, 直接使用指针调用函数
pf(5)
可是可读性会较差, 并且容易产生误解.