前言:函數
函數也有地址, 函數的地址時存儲其機器語言代碼(即二進制的字節碼)的內存的開始地址.一般, 這鞋地址對用戶而言, 既不重要, 也沒有什麼用, 可是對程序卻頗有用指針
當知道地址以後, 就能夠聲明指針, 指針就能夠指向函數的地址, 有了地址和指針, 就能夠將函數的指針傳做爲參數傳遞給另外一個函數.內存
與直接調用另外一個函數不一樣的是, 它容許在不一樣的時間傳遞不一樣的函數地址. 這意味着能夠在不一樣得時間使用不一樣的函數.原型
當咱們要將函數的地址 做爲參數 傳給另一個函數時, 須要有如下三個條件才能達到要求: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)
可是可讀性會較差, 並且容易產生誤解.