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

2021-10-10 12:42:05 字數 3337 閱讀 6284

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

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

intmain()

這是在幹什麼?(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)

intmain()

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)

intmain()

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語言函式指標的理解與使用

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

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

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