回调函数-例子-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");
}


运行结果为:

在这里插入图片描述

  对于回调函数我理解的还不是很深刻,我觉得这是需要通过真正的项目才能真正深入理解。自己写的代码太少,内容不多,其实发挥不了回调函数真正的价值。
  不班门弄斧了,继续学习吧。以后有机会再深入了解的话会再更新相关内容!

猜你喜欢

转载自blog.csdn.net/lei2014lei/article/details/85132173