C++ 指向函数的指针和递归

前言:

函数也有地址, 函数的地址时存储其机器语言代码(即二进制的字节码)的内存的开始地址.通常, 这鞋地址对用户而言, 既不重要, 也没有什么用, 但是对程序却很有用

当知道地址之后, 就可以声明指针, 指针就可以指向函数的地址, 有了地址和指针, 就可以将函数的指针传作为参数传递给另一个函数.

与直接调用另一个函数不同的是, 它允许在不同的时间传递不同的函数地址. 这意味着可以在不同得时间使用不同的函数.

 

当我们要将函数的地址  作为参数 传给另外一个函数时, 需要有以下三个条件才能达到要求:

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)

但是可读性会较差, 而且容易产生误解.

 

posted @ 2019-02-27 21:31  Derek丶D  阅读(604)  评论(0编辑  收藏  举报