跳到主要内容
🔍

代码示例: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;
    }