C 學習筆記 四 指標(2)轉

2022-09-16 07:09:13 字數 1506 閱讀 1421

分類: 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...