C 速查手冊

6.5.6 函數指標

函數 (function) 雖然並非資料,然而編譯器 (compiler) 實際會替函數的程式碼配置記憶體位址,當呼叫函數時,也就是控制權移轉給被呼叫函數的時候,程式執行便會轉移到該記憶體位址的地方。因此,呼叫函數可以直接用指標 (pointer) ,這是 C 語言提供的動態機制,有許多不可取代的地方。

如下例為選單驅動程式的簡化版

#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");
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:funptr.c
    功能:示範函數指標的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc funptr.c
$ a.out
選項1...
選項2...
選項3...
 
上面以函數指標各自呼叫fun1、fun2、fun3...
$

main() 之前

void fun1(void);
void fun2(void);
void fun3(void);

一共宣告了三個函數,然後 main() 裡的第 1 行

void (*f[3])(void) = {fun1, fun2, fun3};

這是宣告一個名為 f 存放函數指標的陣列,由於指標宣告的星號 * ,運算優先次序比用為函數參數列的小括弧為低,所以這裡指標陣列 *f[3] 要用小括弧圍起來。

因為是存放函數指標的陣列 (pointer) ,所以連同函數的回傳值型態 (return type) 及參數列 (parameter list) 都要加進宣告之中。

其後的大括弧裡面放的即為函數名稱,呼叫函數以陣列的使用方式即可。

這個程式的目的主要為示範函數指標的使用,因此 for 迴圈的部分

for (i = 0; i < 3; i++) {
    (*f[i])();
}

就是依序呼叫三個函數。

上一頁 6.5.5 參數與回傳值型態
回 C 速查手冊首頁
下一頁 單元 7 - 宣告
回 C 教材首頁
回程式語言教材首頁