函數指標指向可執行程式碼的進入位址,宣告語法:
// 回傳型別 (*指標名稱) (參數列表) int (*compare)(int a, int b); // 指向 int func(int, int) void (*callback)(const char *msg); // 指向 void func(const char*)
關鍵技巧:使用 typedef 簡化複雜宣告:
typedef int (*CompareFunc)(int, int); CompareFunc cmp = &myCompare; // 或直接 cmp = myCompare;
回呼 = 將函數指標作為參數傳遞給另一個函數,由被呼叫者在適當時機調用。實現「控制反轉」與演算法解耦。
qsort 使用 int (*compar)(const void*, const void*)。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
float score;
} Student;
// 回呼函數:修飾姓名
void decorateName(char *name) {
strcat(name, "-高富帥");
}
// 泛型搜尋:分數超過門檻者執行回呼
void searchAndProcess(Student *stus, int count, float threshold, void (*processor)(char*)) {
for (int i = 0; i < count; i++) {
if (stus[i].score > threshold) {
processor(stus[i].name);
}
}
}
// 輸入學員資料
Student *inputStudents(int n) {
Student *arr = malloc(n * sizeof(Student));
for (int i = 0; i < n; i++) {
printf("第 %d 位學員姓名: ", i+1);
scanf("%19s", arr[i].name);
printf("分數: ");
scanf("%f", &arr[i].score);
}
return arr;
}
void printStudents(Student *stus, int n) {
puts("\n---------- 學員名單 ----------");
for (int i = 0; i < n; i++)
printf("%-10s %6.2f\n", stus[i].name, stus[i].score);
puts("------------------------------\n");
}
int main() {
Student *stus = inputStudents(3);
printStudents(stus, 3);
printf(">>> 篩選 90 分以上並修飾姓名 <<<\n");
searchAndProcess(stus, 3, 90.0f, decorateName);
printStudents(stus, 3);
free(stus);
return 0;
}
C 無原生閉包,但可透過 void *context 傳遞狀態:
typedef void (*Action)(void *ctx, int item);
void forEach(int *arr, int n, Action act, void *ctx) {
for (int i = 0; i < n; i++) act(ctx, arr[i]);
}
// 使用者自訂結構體攜帶狀態
typedef struct { int sum; int count; } StatsCtx;
void accumulate(void *ctx, int val) {
StatsCtx *s = ctx;
s->sum += val;
s->count++;
}
int main() {
int data[] = {1,2,3,4,5};
StatsCtx ctx = {0};
forEach(data, 5, accumulate, &ctx);
printf("平均: %.2f\n", (float)ctx.sum / ctx.count);
}
typedef void (*Handler)(void);
Handler handlers[] = {
handleIdle,
handleRun,
handleJump,
handleAttack
};
void dispatch(int state) {
if (state >= 0 && state < 4) handlers[state]();
}
__cdecl/__stdcall 等呼叫慣例。if (funcPtr) funcPtr();。函數指標是 C 語言實現多態、回呼、泛型演算法的核心機制。掌握 typedef 簡化宣告、void* context 傳遞狀態、函數指標陣列構建跳躍表三大模式,即可靈活應對各種系統級開發需求。