回调函数-例子-C语言
之前看到过关于回调函数的内容,不是特别理解,最近突然又看到了关于回调函数的内容,想着试着把代码实现一遍可能会加深理解。于是搜了一下回调函数的概念,在百度百科上看到的概念:回调函数概念
根据上面给的代码,我试着敲了一遍,竟然能够运行出来,我也很是诧异,不过也挺开心的,虽然不是自己写的,只是敲了一遍,但是对于理解回调函数还是有一定的作用的。
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
typedef unsigned char byte;
typedef int (*CompareFunction)(const byte*a,const byte*b);
//两个数字比较大小
int comInt(const byte *a,const byte *b)
{
int i1 = *(int*)a;
int i2 = *(int*)b;
if(i1 > i2)
return 1;
if(i1 < i2)
return -1;
return 0;
}
//两个字符串比较大小
int comString(const byte*s1,const byte*s2)
{
const char *c1 = (char*)s1;
const char *c2 = (char*)s2;
/*此处之前写的是return strcmp(c1,c2)\
但是由于strcmp函数当c1>c2时,返回的是正数,但不一定是1,
而在排序算法中是按照1来判断的,所以此处进行了修改*/
int n = strcmp(c1,c2);
if(n > 0)
return 1;
if(n < 0)
return -1;
return 0;
}
//冒泡排序
//void BubbleSortT(byte *array,int size,int elem_size,int (*ptr)())//这种写法也是正确的
void BubbleSortT(byte *array,int size,int elem_size,CompareFunction cmpFun)
{
int i,j;
for(i = 0;i < size;i ++)
{
for(j = 0;j < size - i - 1;j ++)
{
//被注释掉的这行对应于上面被注释掉的函数的写法
//if(1 == (*ptr)(array + j * elem_size,array + (j + 1) * elem_size))
if(1 == cmpFun(array + j * elem_size,array + (j + 1) * elem_size))
{
byte *temp = (byte *)malloc(sizeof(byte));
memcpy(temp,array + j * elem_size,elem_size);
memcpy(array + j * elem_size,array + (j + 1)*elem_size,elem_size);
memcpy(array + (j + 1) * elem_size,temp,elem_size);
free(temp);
}
}
}
}
int main(int argc, char* argv[])
{
int i = 0;
int arr1[5] = {
5432,4321,3210,2109,1098};
printf("数组arr1排序前:\n");
for(i = 0;i < 5;i ++)
{
printf("%d ",arr1[i]);
}
printf("\n");
BubbleSortT((byte*)arr1,5,sizeof(int),comInt);
printf("数组arr1排序后:\n");
for(i = 0;i < 5;i ++)
{
printf("%d ",arr1[i]);
}
printf("\n");
char ch[5][10] = {
"fsdc","aewq","fasss","fsdccc","dhijk"};
printf("数组ch排序前:\n");
for(i = 0;i < 5;i ++)
{
printf("%s ",ch[i]);
}
printf("\n");
BubbleSortT((byte*)ch,5,10,comString);
printf("数组ch排序后:\n");
for(i = 0;i < 5;i ++)
{
printf("%s ",ch[i]);
}
printf("\n");
}
运行结果为:
对于回调函数我理解的还不是很深刻,我觉得这是需要通过真正的项目才能真正深入理解。自己写的代码太少,内容不多,其实发挥不了回调函数真正的价值。
不班门弄斧了,继续学习吧。以后有机会再深入了解的话会再更新相关内容!
还没有评论,来说两句吧...