C語言函式指標

2021-06-22 22:40:26 字數 3223 閱讀 9275

一、函式指標的定義 

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

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; 這樣子是不是好看一些呢?只可惜編譯器不這麼想。^_^。 

二、函式指標的使用 

1、函式指標使用的例子 

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

#include

#include

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

else  

} int main() 

我們使用指標的時候,需要通過鑰匙(「*」)來取其指向的記憶體裡面的值,函式指標使用也如此。通過用(*pf)取出存在這個位址上的函式,然後呼叫它。這裡需要注意到是,在visual c++6.0 裡,給函式指標賦值時,可以用&fun 或直接用函式名fun。這是因為函式名被編譯之後其實就是乙個位址,所以這裡兩種用法沒有本質的差別。這個例子很簡單,就不再詳細討論了。  

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

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

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

3、(*(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 **); 

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

4、函式指標陣列 

現在我們清楚表示式「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()  

5、函式指標陣列的指標 

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

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

下面就定義乙個簡單的函式指標陣列指標: 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()

C語言 指標函式和函式指標

指標函式和函式指標 指標函式其實是乙個簡稱,是指帶指標的函式,它本質上是乙個函式,只是返回的是某種型別的指標。其定義的格式為 型別識別符號 函式名 參數列 函式指標,從本質上說是乙個指標,只是它指向的不是一般的變數,而是乙個函式。因為每個函式都有乙個入口位址,函式指標指向的就是函式的入口位址。其定義...

C語言 指標函式和函式指標

1 指標函式是指帶指標的函式,本質上是乙個函式,函式返回值是某一型別的指標 定義 型別識別符號 函式名 參數列 int f int x,int y 它首先是乙個函式,只不過這個函式的返回值是乙個位址值,函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函...

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

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