C++ 指向函數的指針和遞歸

前言:函數

函數也有地址, 函數的地址時存儲其機器語言代碼(即二進制的字節碼)的內存的開始地址.一般, 這鞋地址對用戶而言, 既不重要, 也沒有什麼用, 可是對程序卻頗有用指針

當知道地址以後, 就能夠聲明指針, 指針就能夠指向函數的地址, 有了地址和指針, 就能夠將函數的指針傳做爲參數傳遞給另外一個函數.內存

與直接調用另外一個函數不一樣的是, 它容許在不一樣的時間傳遞不一樣的函數地址. 這意味着能夠在不一樣得時間使用不一樣的函數.原型

 

當咱們要將函數的地址  做爲參數 傳給另一個函數時, 須要有如下三個條件才能達到要求: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)

可是可讀性會較差, 並且容易產生誤解.

相關文章
相關標籤/搜索