C 函数指针与回调函数学习笔记

什么是函数指针?

在 C 语言中,函数名本质上就是一个指针,指向该函数所在的内存地址。因此,我们可以把函数的指针称为函数指针。

函数指针的定义格式如下:

cCopy Code
返回类型 (*指针变量名)(参数列表);

例如,我们定义一个函数 add ,并声明一个函数指针 add_p

cCopy Code
int add(int a, int b) { return a + b; } int (*add_p)(int a, int b) = add;

上述代码中,add_p 就是函数 add 的指针,我们可以通过 add_p 调用 add 函数。

函数指针作为参数

函数指针可以作为函数的参数,这样可以让函数更加灵活地运用。

例如,我们定义一个函数 operate,该函数接受两个整数和一个函数指针作为参数,用于对这两个整数进行某种操作,操作方式由函数指针决定:

cCopy Code
void operate(int a, int b, int (*p)(int, int)) { int result = p(a, b); printf("%d\n", result); }

我们可以调用 operate 函数,并传入函数指针 add_p 作为参数:

cCopy Code
operate(1, 2, add_p);

上述代码将输出结果 3

什么是回调函数?

回调函数,顾名思义,就是让被调用函数在完成自己的任务后调用传给它的函数,以便在外部能够获取到这个函数的结果。

例如,我们定义一个函数 sort,该函数接受一个整型数组和一个指向比较函数的函数指针作为参数,用于对该数组进行排序,排序方式由比较函数决定:

cCopy Code
void sort(int *arr, int size, int (*cmp)(int, int)) { for (int i = 0; i < size - 1; ++i) { for (int j = i + 1; j < size; ++j) { if (cmp(arr[i], arr[j]) > 0) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } }

我们定义一个比较函数 greater_than,用于判断两个数的大小关系:

cCopy Code
int greater_than(int a, int b) { return a > b; }

我们可以调用 sort 函数,并传入比较函数 greater_than 作为参数:

cCopy Code
int arr[] = {2, 3, 1, 5, 4}; int size = sizeof(arr) / sizeof(int); sort(arr, size, greater_than);

上述代码将对整型数组进行升序排序。

实例

下面是一个完整的示例,演示了如何使用函数指针和回调函数:

cCopy Code
#include <stdio.h> int add(int a, int b) { return a + b; } void operate(int a, int b, int (*p)(int, int)) { int result = p(a, b); printf("%d\n", result); } int greater_than(int a, int b) { return a > b; } void sort(int *arr, int size, int (*cmp)(int, int)) { for (int i = 0; i < size - 1; ++i) { for (int j = i + 1; j < size; ++j) { if (cmp(arr[i], arr[j]) > 0) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } } int main() { // 函数指针示例 int (*add_p)(int, int) = add; operate(1, 2, add_p); // 回调函数示例 int arr[] = {2, 3, 1, 5, 4}; int size = sizeof(arr) / sizeof(int); sort(arr, size, greater_than); for (int i = 0; i < size; ++i) { printf("%d ", arr[i]); } return 0; }

该示例首先演示了如何使用函数指针,将函数 add 的指针作为参数传入函数 operate 中。

接着,示例演示了如何使用回调函数,将比较函数 greater_than 的指针作为参数传入函数 sort 中,实现对整型数组的升序排序。

以上就是 C 函数指针与回调函数的学习笔记。