typedef 配合函式指標的使用可以大大的簡化程式碼,藉由創造出一個新的數據型態可以讓程式碼較為整潔
首先我們用以下的例子來進行說明
#include "stdio.h"
int add(int a, int b) {
return a + b;
}
int mult(int a, int b) {
return a * b;
}
int main() {
// 宣告函式指標變數
int (*FuncPtr)(int a, int b);
FuncPtr = add;
printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
FuncPtr = mult;
printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
FuncPtr = add; //若又要再指向 add ,則要再把 FuncPtr 指向 add 一次
printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
}
若我們在第 14 行宣告了一個函式指標變數,則我們要再次使用 add 函數時,就必須要重新指向 add 函數
#include "stdio.h"
int add(int a, int b) {
return a + b;
}
int mult(int a, int b) {
return a * b;
}
int main() {
// 宣告函式指標變數
int (*FuncPtr)(int a, int b);
// 宣告另一個函式指標變數
int (*FuncPtr_1)(int a, int b);
FuncPtr = add;
printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
FuncPtr_1 = mult;
printf("FuncPtr_1(3,5) = %d, function address = %p \n", FuncPtr_1(3,5) ,FuncPtr_1);
printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
}
當然,若我們再宣告一個函式指標變數 int (*FuncPtr_1)(int a, int b); 是可以解決必須重新指向的問題,但這樣的作法不甚好,若有很多不同的函數就必須要很多的函式指標變數。
使用 typedef 是更好的選擇
#include "stdio.h"
int add(int a, int b) {
return a + b;
}
int mult(int a, int b) {
return a * b;
}
int main() {
// 創建一個新的數據型態
typedef int (*FuncPtr)(int a, int b);
FuncPtr FuncPtr_add = add;
FuncPtr FuncPtr_mult = mult;
printf("FuncPtr_add(3,5) = %d, function address = %p \n", FuncPtr_add(3,5) ,FuncPtr_add);
printf("FuncPtr_mult(3,5) = %d, function address = %p \n", FuncPtr_mult(3,5) ,FuncPtr_mult);
printf("FuncPtr_add(3,5) = %d, function address = %p \n", FuncPtr_add(3,5) ,FuncPtr_add);
}
我們在第 14 行使用 typedef 創建了一個新的數據型態。
該數據型態名為 FuncPtr ,本質上是一個指標,具有兩個輸入引數一個回傳値。
接著在 16 行(17行同理) 宣告了一個名為 FuncPtr_add 的 FuncPtr 型態 的函式指標變數
並賦予初使値使其指向函數 add