C语言中函数指针和回调函数的实现原理是什么?
函数指针基础:
-
函数指针声明
c// 返回类型 (*指针名)(参数列表) int (*func_ptr)(int, int); // 指向函数的指针 int add(int a, int b) { return a + b; } func_ptr = add; // 通过指针调用函数 int result = func_ptr(3, 5); // 等同于 add(3, 5) -
函数指针数组
cint (*operations[])(int, int) = {add, subtract, multiply}; int result = operations[0](10, 5); // 调用 add -
作为函数参数
cvoid process_array(int *arr, int size, int (*callback)(int)) { for (int i = 0; i < size; i++) { arr[i] = callback(arr[i]); } }
回调函数实现:
-
排序回调
cint compare_asc(const void *a, const void *b) { return (*(int*)a - *(int*)b); } int arr[] = {5, 2, 8, 1, 9}; qsort(arr, 5, sizeof(int), compare_asc); -
事件处理回调
ctypedef void (*EventHandler)(void); void on_click() { printf("Button clicked!\n"); } void register_event(EventHandler handler) { handler(); // 触发回调 } -
异步操作回调
ctypedef void (*AsyncCallback)(int result, void *user_data); void async_operation(AsyncCallback callback, void *data) { // 模拟异步操作 int result = perform_task(); callback(result, data); }
高级应用:
-
状态机实现
ctypedef void (*StateHandler)(void); void state_idle() { /* ... */ } void state_running() { /* ... */ } void state_paused() { /* ... */ } StateHandler states[] = {state_idle, state_running, state_paused}; int current_state = 0; states[current_state](); -
策略模式
ctypedef int (*Strategy)(int, int); int strategy_max(int a, int b) { return a > b ? a : b; } int strategy_min(int a, int b) { return a < b ? a : b; } void execute_strategy(Strategy strategy, int x, int y) { printf("Result: %d\n", strategy(x, y)); }
注意事项:
- 函数指针类型必须完全匹配
- 空指针检查是必要的
- 回调函数的上下文管理很重要