c語言函式指標的理解與使用

2021-08-21 15:53:17 字數 3656 閱讀 6776

c語言函式指標的理解與使用

1.函式指標的定義

顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。看例子:

a) char * (*fun1)(char * p1,char * p2);

b) char * *fun2(char * p1,char * p2);

c) char * fun3(char * p1,char * p2);

看看上面三個表示式分別是什麼意思?

c)這很容易,fun3是函式名,p1,p2是引數,其型別為char *型,函式的返回值為char *型別。

b) 也很簡單,與c)表示式相比,唯一不同的就是函式的返回值型別為char**,是個二級指標。

a) fun1是函式名嗎?回憶一下前面講解陣列指標時的情形。我們說陣列指標這麼定義或許更清晰:

int (*)[10] p;

再看看a)表示式與這裡何其相似!明白了吧。這裡fun1不是什麼函式名,而是乙個指標變數,它指向乙個函式。這個函式有兩個指標型別的引數,函式的返回值也是乙個指標。同樣,我們把這個表示式改寫一下:

char * (*)(char * p1,char * p2) fun1;

這樣子是不是好看一些呢?只可惜編譯器不這麼想。^_^。

2.函式指標使用的例子

上面我們定義了乙個函式指標,但如何來使用它呢?先看如下例子:

#include 

#include

char * fun(char * p1,char * p2)

else

}int main()

我們使用指標的時候,需要通過鑰匙(「*」)來取其指向的記憶體裡面的值,函式指標使用也如此。通過用(*pf)取出存在這個位址上的函式,然後呼叫它。

這裡需要注意到是,在visual c++6.0裡,給函式指標賦值時,可以用&fun或直接用函式名fun。這是因為函式名被編譯之後其實就是乙個位址,所以這裡兩種用法沒有本質的差別。這個例子很簡單,就不再詳細討論了。

3.*(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) ();就是表示對函式的呼叫。

講解到這裡,相信你已經明白了。其實函式指標與普通指標沒什麼差別,只是指向的內容不同而已。

使用函式指標的好處在於,可以將實現同一功能的多個模組統一起來標識,這樣一來更容易後期的維護,系統結構更加清晰。或者歸納為:便於分層設計、利於系統抽象、降低耦合度以及使介面與實現分開。

4.(*(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 **);

如果沒有上面的分析,肯怕不容易把這個表示式看明白吧。不過現在應該是很簡單的一件事了。讀者以為呢?

5.函式指標陣列

現在我們清楚表示式

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()

6.函式指標陣列的指標

看著這個標題沒發狂吧?函式指標就夠一般初學者折騰了,函式指標陣列就更加麻煩,現在的函式指標陣列指標就更難理解了。

其實,沒這麼複雜。前面詳細討論過陣列指標的問題,這裡的函式指標陣列指標不就是乙個指標嘛。只不過這個指標指向乙個陣列,這個陣列裡面存的都是指向函式的指標。僅此而已。

下面就定義乙個簡單的函式指標陣列指標:

char * (*(*pf)[3])(char * p);

注意,這裡的pf和上一節的pf就完全是兩碼事了。上一節的pf並非指標,而是乙個陣列名;這裡的pf確實是實實在在的指標。這個指標指向乙個包含了3個元素的陣列;這個數字裡面存的是指向函式的指標;這些指標指向一些返回值型別為指向字元的指標、引數為乙個指向字元的指標的函式。

#include 

#include

char * fun1(char * p)

char * fun2(char * p)

char * fun3(char * p)

int main()

參考:陳正衝老師的《

c語言深度剖析》。

c語言函式指標的理解與使用

c語言函式指標的理解與使用

1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。看例子 a char fun1 char p1,char p2 b char fun2 char p1,char p2 c char fun3 char p1,char p2 看看上面三個表示式分別是什麼意思?c 這很...

c語言函式指標的理解與使用

顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。看例子 a.char fun1 char p1,char p2 b.char fun2 char p1,char p2 c.char fun3 char p1,char p2 看看上面三個表示式分別是什麼意思?c.這很容易,fun3是函式...

c語言函式指標與指標函式

include include include using namespace std 1 c語言函式指標 解釋 這是一種很特殊的指標,它的指向是乙個函式的入口 作用 該指標可以接受乙個函式的位址,代表這個函式執行函式的操作 函式指標舉例 下面是乙個函式指標pfunc,它只能指向返回值為float,...