代码示例:1.3.4 函数指针与回调
全部示例均标注编译命令、适用环境与实测状态;完整验证记录见《03.5-代码编译运行验证记录》。
examples/ex1-function-pointer.c · 函数指针基础与 typedef 递进
/* ex1-function-pointer.c —— 函数指针基础与 typedef 递进(1.3.4 ex1) * 适用环境:Linux / Windows(MinGW) 标准:C11 * 编译:gcc ex1-function-pointer.c -o ex1 -std=c11 -Wall -Wextra -Wpedantic * 运行:./ex1(Windows: ex1.exe) */ #include <stdio.h> static int add(int a, int b) { return a + b; } static int sub(int a, int b) { return a - b; } int main(void) { /* 递进一:完整类型声明(括号不能省) */ int (*op)(int, int) = &add; /* &add 与 add 等价 */ printf("op(3, 4) = %d\n", op(3, 4)); /* 与 (*op)(3, 4) 等价 */ printf("(*op)(3, 4) = %d\n", (*op)(3, 4)); /* 递进二:typedef 简化 */ typedef int (*op_fn)(int, int); op_fn f = sub; printf("f(10, 4) = %d\n", f(10, 4)); return 0; }examples/ex2-callback.c · 回调框架:注册两个操作 → 统一触发
/* ex2-callback.c —— 回调框架:注册两个操作 → 统一触发(1.3.4 ex2) * 适用环境:Linux / Windows(MinGW) 标准:C11 * 编译:gcc ex2-callback.c -o ex2 -std=c11 -Wall -Wextra -Wpedantic * 运行:./ex2(Windows: ex2.exe) * 说明:run_all 是"框架":它不关心具体操作是什么,只按接口 calc_fn 逐个调用; * add/sub/mul 是"回调":由 main 注册进数组,事件(循环迭代)触发。 */ #include <stdio.h> typedef int (*calc_fn)(int, int); static int add(int a, int b) { return a + b; } static int sub(int a, int b) { return a - b; } static int mul(int a, int b) { return a * b; } /* 迷你回调框架:注册 → 统一触发 */ static void run_all(calc_fn fns[], int count, int x, int y) { int i; for (i = 0; i < count; i++) { printf("fn[%d](%d, %d) = %d\n", i, x, y, fns[i](x, y)); } } int main(void) { calc_fn ops[3] = { add, sub, mul }; /* 注册三个回调 */ run_all(ops, 3, 8, 3); /* 统一触发 */ return 0; }examples/ex3-qsort.c · qsort 与比较函数(标准库回调)
/* ex3-qsort.c —— qsort 与比较函数(1.3.4 ex3) * 适用环境:Linux / Windows(MinGW) 标准:C11 * 编译:gcc ex3-qsort.c -o ex3 -std=c11 -Wall -Wextra -Wpedantic * 运行:./ex3(Windows: ex3.exe) * 说明:比较函数签名固定为 int (*)(const void*, const void*); * 返回 (a > b) - (a < b) 而非 a - b,避免减法溢出。 */ #include <stdio.h> #include <stdlib.h> static int cmp_int_asc(const void *pa, const void *pb) { const int a = *(const int *)pa; const int b = *(const int *)pb; return (a > b) - (a < b); /* 升序:a<b 返回 -1、a>b 返回 1、相等返回 0 */ } int main(void) { int arr[] = { 42, 7, 15, 3, 99 }; size_t n = sizeof(arr) / sizeof(arr[0]); size_t i; qsort(arr, n, sizeof(arr[0]), cmp_int_asc); for (i = 0; i < n; i++) { printf("%d%s", arr[i], i + 1 < n ? " " : "\n"); } return 0; }