C C 語言中指向函式的指標

2021-04-01 05:31:35 字數 2175 閱讀 5047

「在c語言中,函式本身不是變數,但可以定義指向函式的指標,這種指標可以被賦值、存放於陣列之中,傳遞給函式及作為函式的返回值等」 --《the c programming language second edition》

下面給出幾個簡單的例子來說明指向函式的指標。

第乙個例子說明指向函式的指標如何說明、賦值、呼叫。

#include

#define testdate 100

int func(int a)  /* func用於列印乙個整數 */

main()

其中重點語句的含義如下:

int (*functionpionter)(int a);

functionpionter: 指向乙個返回整數的函式的指標,這個指標有乙個整數引數。

functionpionter = func;

將functionpionter指向函式func;其中函式必須已經定義,且函式和函式指標的說明的返回值必須一致。 

(*functionpionter)(testdate);

通過函式指標呼叫函式;因為函式指標已經指向函式,所以用*取出函式指標的內容就為函式本身。

下面這個例子顯示如何將指向函式的指標傳遞給函式、作為函式的返回型別。在這個例子中,有三個函式:

hello:返回字元指標的函式,用來返回字串「hello world!/n」

retfunc:返回乙個指向函式的指標的函式,且返回指標所指的那個函式為乙個返回字元指標的函式。

call:返回乙個void *型的指標,且call有乙個指向函式的指標的引數,且這個函式指標返回乙個字元指標

#include

#define max 100

main()

char *hello()

char *(*rtnfunc())()

void *call(char *(*func)())

上面的例子中,main()無法直接呼叫hello函式,利用兩個函式分別返回hello和呼叫hello,實現了在main()中呼叫hello。雖然,似乎這個程式顯得多餘但卻很好的說明了如何把指向函式的指標傳遞給函式、作為函式的返回。其中call函式利用了void *型指標的靈活機制,使得call的適用性大為增加,這也正是指向函式的指標的優點之一。同樣的例子是《the c programming language second edition》中下面這個函式呼叫:

qsort((void **) lineptr, 0, nlines-1, (int (*)(void *, void *))(numeric ? numcmp : strcmp));

其中,使用了兩次強制型別轉換,其中第二甚至是利用指向函式的指標,將函式的型別進行了轉換。當然上面語句在某些編譯器上無法通過,因為某些編譯器要求條件表達:

表示式1 ? 表示式2 : 表示式3

中表示式2與表示式3的型別相同。當然這樣的要求是不符合ansi標準的。在ansi標準中,如果表示式2與表示式3的型別不同,則結果的型別由型別轉換規則決定。當然,我們可以變同一下,先將兩個函式的型別進行強制轉換來達到目的:

qsort((void **) lineptr, 0, nlines-1, numeric ? (int (*)(void *, void *))numcmp : (int (*)(void *, void *))strcmp));

對於如何直接說明乙個像rtnfunc一樣返回指向函式的指標的函式,我查閱了不少資料,都沒有找到答案,最後是自己硬著頭皮摸索出來的。由此,我也對c的複雜說明有了更深刻的體會,將在以後的技術日記中寫出來。當然在我看來,過多的、不合適的使用這些複雜說明,並不是一種好的程式設計風格,因為它將使程式變得難以理解,同時也增加了出錯的可能性。

乙個比較好的折衷的方法是使用typedef來使程式的含義明朗。下面給出用typedef給寫上面那個程式的例子,其中定義個乙個型別ptofun,用typedef說明ptofun是指向函式的指標型別,指標所指的函式返回乙個字元指標,且沒有引數。

#include

#define max 100

typedef char *(*ptofun)();

main()

char *hello()

ptofun rtnfunc()

void *call(ptofun func)

改寫後的程式的可讀性大為增加,給人一目了然的感覺。

C C 語言中指向函式的指標

在c語言中,函式本身不是變數,但可以定義指向函式的指標,這種指標可以被賦值 存放於陣列之中,傳遞給函式及作為函式的返回值等 the c programming language second edition 下面給出幾個簡單的例子來說明指向函式的指標。第乙個例子說明指向函式的指標如何說明 賦值 呼叫...

C C 語言中指向函式的指標

在c語言中,函式本身不是變數,但可以定義指向函式的指標,這種指標可以被賦值 存放於陣列之中,傳遞給函式及作為函式的返回值等 the c programming language second edition 下面給出幾個簡單的例子來說明指向函式的指標。第乙個例子說明指向函式的指標如何說明 賦值 呼叫...

c 中指向函式的指標

函式指標是指指向函式而非指向物件的指標。像其他指標一樣,函式指標也指向某個特定的型別。函式型別由其返回型別以及形參表確定,而與函式名無關。int pi const string const string 這個語句將pi申明為指向函式的指標,它所指向的函式帶有兩個const string 型別的形參和...