印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0
1. 函数指针的使用场景
函数指针的使用围绕着这样一个概念:函数指针可以被用来作为函数参数
.
接收函数指针的这个函数, 可以回调函数指针所指向的那个函数.
1.1 代码实例
void A() { // 定义一个“A函数”
printf("hello");
}
void B(void (*ptr)()) { // 将“A函数”作为一个“函数指针参数”.
ptr(); // 调用“ptr”函数指针.
}
int main() {
// 第一种方式.
//void (*p)() = A; // 用一个“函数指针”指向“A函数”.
//B(p); // 调用“B函数”, 将“p”这个函数指针传递过去,
// 第二种方式
B(A); // 这里的“B函数”将“A函数”作为一个参数, 所以这里直接这样书写是没有任何问题的.
// 一个函数的应用传给另一个函数的时候, 那个函数被称为“回调函数”.
return 0;
}
1.2 体现“回调函数”的意义的例子
// 这里回调函数的意义是:直接使用一个可以任意修改的函数, 进行任意形式的排序, 而不用在原来的位置上进行修改.
// 比如可以创建很多个“(无论什么)compare函数”, 需要什么样的排序方案, 就创建一个排序的排序方案.
// 只需要增加一个“(无论什么)compare函数”, 比如增加一个:“用绝对值作比较”, “按从小到大”, “按从大到小”.
// 最后在进行参数传递的时候, 将对应的“排序方案的函数传递过去”就行了.
// (这样就不用在原来的主要函数上进行修改了, 这样也能保证主要函数的可移植性)
int compare(int a, int b) {
return a - b;
}
int absolute_compare(int a, int b) {
return (abs(a) > abs(b)) ? 1 : -1;
}
void BubbleSort(int* arr, int n, int (*compare)(int, int)) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (compare(arr[j], arr[j + 1]) > 0) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = { -31, 22, -1, 50, -6, 4 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size, absolute_compare);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
1.2.1 利用 qsort函数
表示“函数指针”意义
qsort函数:
void qsort(void* ptr, size_t count, size_t size, int (*comp)(const void*, const void*));
qsort函数参数说明:
- 第一个参数:接受一个任意类型的数组 (甚至可以是结构体).
- 第二个参数:数组中元素的数量.
- 第三个参数:数据类型的大小
- 最后一个参数:函数指针, 比较函数的指针.
int (*comp)(const void*, const void*)
传入的函数指针是 void*
, 这样可以进行任意的修改, 毕竟 void指针可以修改为任意类型的指针
.