函數雖然並非資料,然而編譯器實際會替函數的程式碼配置記憶體位址,當呼叫函數時,也就是控制權移轉給被呼叫函數的時候,程式執行便會轉移到該記憶體位址的地方。因此,呼叫函數可以直接用指標,這是 C 語言提供的動態機制,有許多不可取代的地方。
如下例為選單驅動程式的簡化版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <stdio.h>void fun1(void);void fun2(void);void fun3(void);int main(void){ void (*f[3])(void) = {fun1, fun2, fun3}; int i; for (i = 0; i < 3; i++) { (*f[i])(); } printf("\n上面以函數指標各自呼叫fun1、fun2、fun3...\n"); return 0;}void fun1(void){ printf("選項1...\n");}void fun2(void){ printf("選項2...\n");}void fun3(void){ printf("選項3...\n");}/* 《程式語言:教學誌》的範例程式 檔名:funptr.c 功能:示範函數指標的使用 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

第 3 到第 5 行
3 4 5 | void fun1(void);void fun2(void);void fun3(void); |
一共宣告了三個函數,然後第 9 行
9 | void (*f[3])(void) = {fun1, fun2, fun3}; |
這是宣告一個名為 f 存放函數指標的陣列,由於指標宣告的星號 * ,運算優先次序比用為函數參數列的小括弧為低,所以這裡指標陣列 *f[3] 要用小括弧圍起來。
因為是存放函數指標的陣列,所以連同函數的回傳值型態及參數列都要加進宣告之中。
其後的大括弧裡面放的即為函數名稱,呼叫函數以陣列的使用方式即可。
這個程式的目的主要為示範函數指標的使用,因此第 12 到第 15 行
12 13 14 | for (i = 0; i < 3; i++) { (*f[i])(); } |
用迴圈依序呼叫三個函數。
沒有留言:
張貼留言