函式指標,函式指標陣列,函式指標陣列的指標

2021-05-24 12:54:51 字數 2721 閱讀 8759

函式指標的使用

先看如下例子:

#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...