函数指针
函数指针声明与调用、回调函数、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 标准库的通用排序,任何类型都能排——只要提供比较函数。