函式指標(function pointer)
Function Pointer 顧名思義,就是指向 Function 的指標。在 C 語言中,不論是 variable、array、struct、或是 function(一段程式碼),都有所屬的起始記憶體位置。
- 變數的指標指向變數的位址,同樣的,function pointer (函式指標) 也是指向函式的位址的指標。
- 而每個function 的啟始記憶體位置,即為 function 的名稱。
而 function pointer 的宣告跟使用 function 時所要注意的地方是相同的,有以下幾點必須注意:
- 回傳值型態(return type)
- 參數數量(augument count)
- 參數型態(argument type)
Function Pointer:指向函數的指標。 int (*pfunc)(int);
- Function return a pointer: 回傳指標的函數。 int* func(int);
- Function pointer return a pointer。 int (pfunc)(int);
// 函式宣告如下
void func1(int int1, char char1);
/* 指向func1的指標如下:
* 這樣的寫法應理解成:funcPtr1是一個函數指標,它指向的函數接受int與char兩個參數並回傳void。(signature)
*/
void (*funcPtr1)(int, char);
/* 如果今天有另一個函式有相同的參考簽名
* 則funcPtr1也能指向func2。
*/
void func2(int int2, char char2);
// 函式指標指向函式1
funcPtr1 = &func1;
// 函式指標指向函式2
funcPtr1 = &func2;
// 在宣告時就直接給予初值,則如下:
void (*funcPtr1)(int, char) = &func1; //&亦可省略
function pointer做為函式的參數
int do_math(float arg1, int arg2) {
return arg2;
}
// 不使用typedef的原始宣告方法
int call_a_func(int (*call_this)(float, int)) {
int output = call_this(5.5, 7);
return output;
}
// 使用typedef的宣告方法
typedef int (*MathFunc)(float, int);
int call_a_func2(MathFunc call_this) {
int output = call_this(5.5, 7);
return output;
}
int final_result = call_a_func(do_math);
function pointer array用法
- 根據state變數的狀態去呼叫對應的函式。
- state: 0,執行run()
- state: 1,執行stop()
- state: 2,執行exit()
void run() { printf("start\r\n"); }
void stop() { printf("stop\r\n"); }
void exit() { printf("exit\r\n"); }
static void (*command[])(void) = {run, stop, exit};
int OnStateChange(uint state) {
if (state > 3) {
printf("Wrong state!\n");
return false;
}
command[state]();
return 0;
}