分類: c++學習筆記
2010-04-03 14:11 283人閱讀
**函式和函式指標
最近在看**,寫**的人很喜歡用**函式和函式指標。一直覺得**函式和函式指標挺神秘的,所以查了一些資料,來與大家一起來分享。
什麼是**函式
簡而言之,**函式就是乙個通過函式指標呼叫的函式。如果你把函式的指標(位址)作為引數傳遞給另乙個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是**函式。
為什麼要使用**函式
因為使用**函式可以把呼叫者和被呼叫者分開,呼叫者不關心誰是被呼叫者,所有它需知道的,只是存在乙個具有某種特定原型、某些限制條件(如返回值為
int)的被呼叫函式。**函式就好像是乙個中斷處理函式,系統在符合你設定的條件時自動呼叫。
如何使用**函式
使用**函式,我們需要做三件事:
· 宣告
· 定義
宣告和定義時應注意,**函式由系統呼叫,所以可以認為它屬於windows
系統不要把它當作你的某個類的成員函式。opijn ipoj ipo
**函式是乙個程式設計師不能顯示呼叫的函式,通過將**函式的位址傳給呼叫者從而實現呼叫。**函式是十分必要的,在我們想通過乙個統一介面實現不同的內容,這時**函式非常合適。
函式指標的宣告
對**函式有了乙個初步的了解,下面我們來說一下函式指標。因為要實現**,必須首先定義函式指標。
void (*) ()
左邊圓括弧中的星號是函式指標宣告的關鍵。另外兩個元素是函式的返回型別(void
)和右邊圓括弧中的入口引數
為函式指標宣告型別定義:
typedef void(* pfv)()
pfv 是乙個函式指標,它指向的函式沒有輸入引數,返回型別為
void。使用這個型別定義名稱可以隱藏負責的函式指標語法。
void (*p)();
void func()
p = func;
p的賦值可以不同,但一定要是函式的指標,並且引數和返回型別相同。
例如:現學現賣的乙個小例子
#include
using namespace std;
typedef void (*pf)();
void func()
void caller( pf pf)
int main()
呼叫約定
在visual c++
中,可以在函式型別前加
_cdecl,_stdcall
或者_pascal
來表示呼叫規範(預設為
_cdecl
)。呼叫規範影響編譯器產生的給定函式名,引數傳遞的順序,堆疊清理責任以及引數傳遞機制。
不過,在win32
的程式中,我見得比較多的是
callback
,這個巨集定義在
windef.h
中,#define callback __stdcall
它約定了函式在它們返回到呼叫者之前,都會從堆疊中移除掉引數。
C 學習筆記 四 指標 4
類成員指標 本文主要討論 c 中類成員的指標,這部分內容少有使用,也比較難於理解。如果文中有錯誤或遺漏之處,敬請指出,謝謝!需要使用類成員指標的情況是比較少見的,所以一般沒人使用這個語言特性。下面先介紹類成員指標的使用方法,再介紹它的可能應用場合。有時,我們需要在類外的其它地方直接獲得類成員,這時我...
C 學習筆記 四 指標 1
函式存放在記憶體的 區域內,它們同樣有位址,我們如何能獲得函式的位址呢?如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同陣列一樣,陣列的名字就是陣列的起始位址。定義乙個指向函式的指標用如下的形式,以上面的test 為例 int fp int a 這裡就定義...
C語言學習筆記(四) 指標
c語言學習筆記 四 指標 include intmain p就是乙個指標,p就是取出p指向位址的值 陣列 相同型別的資料集合 include intmain 在這個程式中,p是乙個指標,a是乙個陣列,若p a 0 或者p a就是p指向陣列的第乙個元素,接下來就可以對p進行 1或 1進行偏移操作 in...