1.回调函数是什么
回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数
时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
我们可以把调⽤的函数的地址以参数的形式 传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能
2.使用冒泡排序模拟实现qsort函数
#include<stdio.h>
// 比较两个整数的函数,用于排序
int cmp_int(const void* e1, const void* e2) {
return (*(int*)e1 - *(int*)e2);
}
// 交换两个元素的内容,通过字节操作
void swap1(void* e1, void* e2, int width) {
int i = 0;
for (i = 0; i < width; i++) {
char tmp = *((char*)e1 + i);
*((char*)e1 + i) = *((char*)e2 + i);
*((char*)e2 + i) = tmp;
}
}
// 交换两个元素的内容,通过指针递增
void swap2(char* e1, char* e2, int width) {
int i = 0;
for (i = 0; i < width; i++) {
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
// 冒泡排序函数
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2)) {
int i = 0, j;
for (i = 0; i < sz - 1; i++) {
for (j = 0; j < sz - i - 1; j++) {
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
swap2((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
// 打印整数数组
void print_arr(int arr[], int sz) {
int i = 0;
for (i = 0; i < sz; i++)
printf("%d ", arr[i]);
printf("\n");
}
// 测试函数
void test1() {
int arr[] = {3, 1, 5, 2, 4, 8, 7, 6, 9, 0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
print_arr(arr, sz);
}
// 主函数
int main() {
test1(); // 调用测试函数
return 0;
}