函式指標的使用
先看如下例子:
#include
#include
char * fun(char * p1,char * p2)
else
}int main()
我們使用指標的時候,需要通過鑰匙(「*」)來取其指向的記憶體裡面的值,函式指標使
用也如此。通過用(*pf)取出存在這個位址上的函式,然後呼叫它。這裡需要注意到是,在
visual c++6.0 裡,給函式指標賦值時,可以用&fun 或直接用函式名fun。這是因為函式名被
編譯之後其實就是乙個位址,所以這裡兩種用法沒有本質的差別。這個例子很簡單,就不再
詳細討論了。
*(int*)&p ----這是什麼?
也許上面的例子過於簡單,我們看看下面的例子:
void function()
int main()
這是在幹什麼?*(int*)&p=(int)function;表示什麼意思?
別急,先看這行**:
void (*p)();
這行**定義了乙個指標變數p,p 指向乙個函式,這個函式的引數和返回值都是void。
&p 是求指標變數p 本身的位址,這是乙個32 位的二進位制常數(32 位系統)。
(int*)&p 表示將位址強制轉換成指向int 型別資料的指標。
(int)function 表示將函式的入口位址強制轉換成int 型別的資料。
分析到這裡,相信你已經明白*(int*)&p=(int)function;表示將函式的入口位址賦值給指
針變數p。
那麼(*p) ();就是表示對函式的呼叫。
講解到這裡,相信你已經明白了。其實函式指標與普通指標沒什麼差別,只是指向的內
容不同而已。
使用函式指標的好處在於,可以將實現同一功能的多個模組統一起來標識,這樣一來更
容易後期的維護,系統結構更加清晰。或者歸納為:便於分層設計、利於系統抽象、降低耦
合度以及使介面與實現分開。
(*(void(*) ())0)()------這是什麼?
是不是感覺上面的例子太簡單,不夠刺激?好,那就來點刺激的,看下面這個例子:
(*(void(*) ())0)();
這是《c traps and pitfalls》這本經典的書中的乙個例子。沒有發狂吧?下面我們就來分
析分析:
第一步:void(*) (),可以明白這是乙個函式指標型別。這個函式沒有引數,沒有返回值。
第二步:(void(*) ())0,這是將0 強制轉換為函式指標型別,0 是乙個位址,也就是說一
個函式存在首位址為0 的一段區域內。
第三步:(*(void(*) ())0),這是取0 位址開始的一段記憶體裡面的內容,其內容就是儲存
在首位址為0 的一段區域內的函式。
第四步:(*(void(*) ())0)(),這是函式呼叫。
好像還是很簡單是吧,上面的例子再改寫改寫:
(*(char**(*) (char **,char **))0) ( char **,char **);
如果沒有上面的分析,肯怕不容易把這個表示式看明白吧。不過現在應該是很簡單的
一件事了。讀者以為呢?
函式指標陣列
現在我們清楚表示式「char * (*pf)(char * p)」定義的是乙個函式指標pf。既然pf 是一
個指標,那就可以儲存在乙個陣列裡。把上式修改一下:
char * (*pf[3])(char * p);
這是定義乙個函式指標陣列。它是乙個陣列,陣列名為pf,陣列內儲存了3 個指向函式的
指標。這些指標指向一些返回值型別為指向字元的指標、引數為乙個指向字元的指標的函
數。這念起來似乎有點拗口。不過不要緊,關鍵是你明白這是乙個指標陣列,是陣列。
函式指標陣列怎麼使用呢?這裡也給出乙個非常簡單的例子,只要真正掌握了使用方法,
再複雜的問題都可以應對。如下:
#include
#include
char * fun1(char * p)
char * fun2(char * p)
char * fun3(char * p)
int main()
函式指標陣列的指標
看著這個標題沒發狂吧?函式指標就夠一般初學者折騰了,函式指標陣列就更加麻煩,
現在的函式指標陣列指標就更難理解了。
其實,沒這麼複雜。前面詳細討論過陣列指標的問題,這裡的函式指標陣列指標不就是
乙個指標嘛。只不過這個指標指向乙個陣列,這個陣列裡面存的都是指向函式的指標。僅
此而已。
下面就定義乙個簡單的函式指標陣列指標:
char * (*(*pf)[3])(char * p);
注意,這裡的pf 和上一節的pf 就完全是兩碼事了。上一節的pf 並非指標,而是乙個陣列名;
這裡的pf 確實是實實在在的指標。這個指標指向乙個包含了3 個元素的陣列;這個數字裡
面存的是指向函式的指標;這些指標指向一些返回值型別為指向字元的指標、引數為乙個
指向字元的指標的函式。這比上一節的函式指標陣列更拗口。其實你不用管這麼多,明白
這是乙個指標就ok 了。其用法與前面講的陣列指標沒有差別。下面列乙個簡單的例子:
#include
#include
char * fun1(char * p)
char * fun2(char * p)
char * fun3(char * p)
int main()
指標陣列,陣列指標,指標函式,函式指標
int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。int func void 指標函式。無參函式,返回整型指標。int func void 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...
陣列指標,指標陣列,函式指標,指標函式
陣列指標,指標陣列,函式指標,指標函式 指標 變數,存放變數的位址。例 int ptr,ptr是乙個指向整形變數的指標 陣列 例 int a 10 定義了乙個具有10個元素的一維陣列,其中陣列的每個元素是乙個int型別。陣列指標 陣列首元素位址的指標,即是指向陣列的指標。例 int ptr 10 c...
指標陣列 陣列指標 指標函式 函式指標
int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。陣列的每個元素都是指標 int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。乙個指標指向有4個整型元素的陣列 int func void 指標函式。無參函式,返回整型指標。函式的返回值為int int func...