回调函数的简单理解及应用

前言:本篇文章是我对回调函数的一个简单的理解,用两个应用:计算器实现和用冒泡的方式实现qsort函数来解释什么是回调函数。

回调函数是什么

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

我的简单理解:假设现在有两个函数一个a函数,一个b函数,我们将a函数的地址存在一个函数指针里边,传给b函数,然后b函数通过一些条件对这个函数指针进行使用来调用它所指向的函数,既(a函数),那么就称为a函数为回调函数。

使用回调函数实现一个简单的计算器

    #include<stdio.h>
    #include<windows.h>

    int Add(int x, int y)
    {
        return x + y;
    }
    int Mul(int x, int y)
    {
        return x * y;
    }
    int Sub(int x, int y)
    {
        return x - y;
    }
    int Div(int x, int y)
    {
        return x / y;
    }
    void menu()
    {
        printf("******************************\n");
        printf("******  1.Add    2.Mul *******\n");
        printf("******  3.Sub    4.Div *******\n");
        printf("******      0.Exit    ********\n");
        printf("******************************\n");
    }
    void calc(int (*pcalc)(int ,int))//用一个函数指针接收arr[input]
    {
        int x = 0;
        int y = 0;
        int ret = 0;
        printf("请输入两个操作数:");
        scanf_s("%d%d", &x, &y);
        ret = pcalc(x, y);
        //calc函数通过函数指针调用Add,Mul,Div,Sub函数,这里就可以认为Add,Mul,Div,Sub是回调函数
        //calc这个函数可以计算各种运算,好像变得很通用
        printf("ret=%d\n", ret);
    }
    int main()
    {
        int input = 0;
        int(*arr[5])(int, int) = { 0, Add, Mul, Sub, Div };
        //arr为一个函数指针数组,这里多放一个0是为了下标的输入相匹配
        do
        {
            menu();
            printf("请选择计算类型:");
            scanf("%d", &input);
            if (input >= 1 && input <= 4)
            {
                calc(arr[input]);
                //arr[input]就是访问下标为input的函数指针数组的值,拿到的是一个函数指针
            }
            else if (input != 0)
            {
                printf("输入有误\n");
            }
            else
                ;
        } while (input);
        system("pause");
        return 0;
    }

使用回调函数和冒泡方式实现qsort函数


    #include<stdio.h>
    #include<string.h>
    #include<windows.h>
    int int_cmp(const void*p1, const void*p2)
    {
        return (*(int*)p1) - (*(int*)p2);
    }
    //比较函数
    void swap(char *e1, char *e2, int width)
    {
        while (width--)
        {
            char temp = *e1;
            *e1 = *e2;
            *e2 = temp;
            e1++;
            e2++;
        }
    }
    void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2))
    //用函数指针接收
    {
        int i = 0;
        for (i = 0; i < sz-1; i++)
        {
            int j = 0;
            for (j = 0; j < sz - 1 - i; j++)
            {
                if (cmp((char *)base + j*width, (char *)base + (j + 1)*width))
                    //通过函数指针调用函数int_cmp
                {
                    swap((char *)base + j*width, (char *)base + (j + 1)*width ,width);
                }
            }
        }
    }
    int main()
    {
        int i = 0;
        int arr[] = { 1, 2, 4, 6, 8, 3, 0 };
        int sz = sizeof(arr) / sizeof(arr[0]);
        bubble_sort(arr, sz, sizeof(int), int_cmp);
        //传参int_cmp为函数的地址,是一个函数指针
        for (i = 0; i < sz; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
        system("pause");
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/80884300