前言
大家好呀,今天分享一下上期指针进阶中剩余的内容——回调函数,这个很重要滴,让我们一起来学会学懂他吧!!!
一、回调函数是什么
简单来说就是:在另一个函数中利用函数指针调用的函数叫做回调函数
二、回调函数的使用
1.使用标准库中的qsort函数
qsort函数不仅可以排序整型数组,还可以排序结构体等数据类型
代码如下:
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return 0;
}
整型数组排序的运行结果展示:
2.利用qsort函数对结构体数组进行排序
先看代码如下:
#include<stdio.h>
#inlcude<string.h>
struct stu {
int age;
char name[20];
double score;
};
int compar_by_age(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int compar_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{
struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
int Ssz = sizeof(S) / sizeof(S[0]);
qsort(S, Ssz, sizeof(S[0]), compar_by_age);
qsort(S, Ssz, sizeof(S[0]), compar_by_name);
return 0;
}
排序前后结果对比:
这是排序前结构体数组的顺序:
三、实现qsort函数
我们先来看一下qsort函数在标准库中的模样:
作者是依据冒泡排序实现的qosrt函数,我们之间上代码:
#include<stdio.h>
#inlcude<string.h>
int compar_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
}
void Swap(char* x, char* y,int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char temp = *x;
*x = *y;
*y = temp;
x++;
y++;
}
}
void Bubble_Sort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*))
{
int i = 0;
for (i = 0; i < num - 1; i++)
{
int j = 0;
for (j = 0; j < num - 1 - i; j++)
{
if (compar(((char*)base + j * size), ((char*)base + (j+1)*size))>0)
{
Swap(((char*)base + j * size), ((char*)base + (j+1)*size), size);
}
}
}
}
对其进行测试:
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
int Ssz = sizeof(S) / sizeof(S[0]);
int sz = sizeof(arr) / sizeof(arr[0]);
Bubble_Sort(arr,sz,sizeof(arr[0]),compar_by_int);
Print(arr, sz);
Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_age);
Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_name);
return 0;
}
可以得到,排序结果和上面调用标注库中qsort函数的结果是相同的
总结
关于回调函数的分享就到这里啦,希望qsort函数可以帮助到大家,博主感觉他真的是很有用,以后会尽量使用到他的,希望本篇文章可以帮助到大家,谢谢大家阅读!!!