函式指標是指向函式的指標變數。 因此「函式指標」本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,c在編譯時,每乙個函式都有乙個入口位址,該入口位址就是函式指標所指向的位址。有了指向函式的指標變數後,可用該指標變數呼叫函式,就如同用指標變數可引用其他型別變數一樣,在這些概念上是大體一致的。函式指標有兩個用途:呼叫函式和做函式的引數。
int
f(elementtype x)
;//宣告函式
int(
*f1)
(elementtype x)
;//宣告函式指標
f1=f;
//函式首位址賦值
f1=&f;
//函式位址賦值
示例:(使用方法)
#include
intmax
(int x,
int y)
intmain()
個人感覺函式指標最大的作用就是作為函式的引數,當函式需要乙個函式作為形參,而這個函式形參未定義或者不確定應該輸入哪個函式時,函式指標的作用就體現出來了,使用位址傳遞的方式,利用函式指標作為形參可以很好地解決這個問題,這有利於程式的模組化與封裝性
例如:像二叉樹遍歷中使用的*visit()函式指標,我們並不清楚,visit應該是輸出、操作、賦值等等哪乙個函式,因此使用*visit函式指標,等實際輸入時再確定它是哪乙個函式。
template
<
class
t>
void bintree
::preorder
(bintreenode
*subtree,
void
(*visit)
(bintreenode
*s))
}void
printnode
(bintreenode<
char
>
*tnode)
intmain()
我們可以將printnode函式定義為模板函式
template
<
class
t>
void
printnode
(bintreenode
*tnode)
但如果在主函式裡定義visit的函式指標模板, 直接如下所示
template
<
class
t>
void
(*visit)
(bintreenode
*tnode)
;
c++會報錯,(原因我也不太清楚)
解決方法: 把函式指標封裝在乙個模板結構或模板類裡,像在bintree類中,我們定義乙個模板函式指標就可以通過
template
<
class
t>
struct type
;
或是放到乙個模板函式內,讓函式指標作為乙個形參,在函式內再呼叫指標指向的函式,但這樣也就沒有特意定義它的必要,他也就像二叉樹遍歷函式中的用法一樣,作為函式形參,不需要特別定義。
template
<
class
t>
void
func
(void
(*visit)
(bintreenode
*tnode)
,bintreenode
*tnode)
函式指標作用
函式指標 是指向函式的指標變數,在c編譯時,每乙個函式都有乙個入口位址,那麼這個指向這個函式的函式指標便指向這個位址。函式指標的用途是很大的,主要有兩個作用 用作呼叫函式和做函式的引數。函式指標的宣告方法 資料型別標誌符 指標變數名 形參列表 一般函式的宣告為 int func int x 而乙個函...
函式 作用域 指標
實參與形參 值傳遞 實參賦值給形參之後,形參在函式體內發生的變化,不會傳回給實參 個數的對應關係 型別轉換 int result power 10 nslog d result int a 10 plus a nslog in main a d a fa 1,2,3,4,5 當無形參時,實參會被忽略...
關於函式指標的作用域
今天在mfc工程中使用了wm user定義使用者訊息,從文件中得知on message的訊息處理函式應該符合如下格式 afx msg lresult cwnd wparam,lparam 其中的作用域 cwnd 引起了我的好奇。我們知道,訊息處理函式只能在cwnd的派生類中定義或者過載,其作用域必然...