有任何不懂的问题可以评论区留言,能力范围内都会一一回答
1.回调函数是什么?
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
我们拿qsort函数举个例子
qsort函数的类型是
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
void* base
指向要排序的数组的第一个对象的指针,将其转换为 .void*
size_t num
所指向的数组中的元素数。
是无符号整数类型。
size_t size
数组中每个元素的大小(以字节为单位)。
是无符号整数类型。
int (*compar)(const void*,const void*)
指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素。它应遵循以下原型:
也就是我们要自己写一个函去作为比较标准
当p1指向的元素比p2大时返回一个大于0的值
当p1指向的元素比p2小时返回一个小于0的值
当p1指向的元素比p2相等时返回一个等于0的值
qsort默认排列的是升序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int comparation (const void*a, const void*b);
void print(void* c,int sz);
int main(void) {
int arr[] = { 1,23,42,32,13312,2323,323,123 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), comparation);
print(arr,sz);
return 0;
}
int comparation(const void*a, const void*b) {
return (*(int*)a-*(int*)b);
}
void print(void* c,int sz) {
for (int i = 0; i < sz; i++)
{
printf("%d\n", *((int *)c + i));
}
}
如上图我们在使用qsort函数的时候我们需要写一个函数作为比较标准
这个标准我们可以自己写,比如把上面的return (*(int*)a-*(int*)b);改成return (*(int*)b-*(int*)a);
我们就可以把qsort变成一个排列降序的函数
但是这里需要注意qsort函数和我们自己编写的函数的类型是确定的,
qosrt函数类型必须是
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
我们自己写的比较原则的函数类型必须是int (*compar)(const void*,const void*)
但是这个地方的void*是为了方便我们接收不同类型的数据,但是void*的数据无法直接使用必须强制转换成其它类型才能使用。
那么思考一下,字符串如何比较呢?字符串可不能像整数类型一样直接比较(> < <= >= = !=都无效),因此这个地方我们必须调用一个用来比较字符串的函数strcmp
strcmp比较的不是字符串的长度而是对应字符的大小
strcmp函数的头文件是#include <string.h>
函数定义 :int strcmp(const char *str1, const char *str2);
这里的 const char* 表示两个参数 str1 和 str2 都是指向字符的指针,并且这些字符都以空字符'\0'结尾。(\0的ASCII码值是0)
函数功能 :
strcmp函数会从两个字符串的首地址开始,逐个比较它们对应位置的字符的ASCII码值,直到遇到不同的字符或者其中一个字符串结束。如果 str1 小于 str2 ,则函数返回一个负值;如果两个字符串相同,函数返回0;如果 str1 大于 str2 ,则函数返回一个正值。
回调函数本质上是在一个函数中调用宁外一个函数,如上面那段代码中,我们在qsort函数中调用了comparation这个函数,comparation就是回调函数。