Z
ZHANK

函数指针

函数指针声明与调用、回调函数、qsort 应用

函数指针

函数也存在内存中,自然可以用指针指向它。函数指针是回调、插件机制、状态机的基础。

学完本章你将: 掌握函数指针声明/调用、回调函数、qsort 实战。


函数指针基础

c
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    // 声明函数指针:返回类型 (*指针名)(参数类型)
    int (*func)(int, int);

    func = add;
    printf("add: %d\n", func(3, 4));       // 7

    func = multiply;
    printf("multiply: %d\n", func(3, 4));  // 12

    return 0;
}

函数指针作为回调

c
// 通用的数组操作,行为由回调决定
void forEach(int *arr, int len, void (*callback)(int)) {
    for (int i = 0; i < len; i++) {
        callback(arr[i]);
    }
}

void printDouble(int x) { printf("%d ", x * 2); }
void printSquare(int x) { printf("%d ", x * x); }

int main() {
    int arr[] = {1, 2, 3, 4};
    forEach(arr, 4, printDouble);  // 2 4 6 8
    forEach(arr, 4, printSquare);  // 1 4 9 16
}

qsort —— 标准库排序函数

c
#include <stdlib.h>

int compare(const void *a, const void *b) {
    int ia = *(int *)a;
    int ib = *(int *)b;
    return ia - ib;   // 正数 = 升序
    // return ib - ia; // 降序
}

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2};
    int n = sizeof(arr) / sizeof(arr[0]);

    qsort(arr, n, sizeof(int), compare);

    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    // 1 1 2 3 4 5 9
}

💡 qsort 是 C 标准库的通用排序,任何类型都能排——只要提供比较函数。