美文网首页C语言基础c/c++
C语言基础---函数指针和回调函数

C语言基础---函数指针和回调函数

作者: ZebraWei | 来源:发表于2018-07-28 18:41 被阅读3次

    版权声明:本文为小斑马伟原创文章,转载请注明出处!
    函数指针:函数指针 是指向函数的指针。
    指针函数:指针函数 函数的返回值是一个指针的函数。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    void func()
    {
       printf("hello world\n");
    }
    
    //函数指针的定义方式
    void test01()
    {
       //先定义出函数类型,再通过类型定义出函数指针
       typedef void(FUNC_TYPE)();
    
       FUNC_TYPE* pFunc = func;
    
       pFunc();
    }
    
    void test02()
    {
       //先定义出函数指针类型,再定义函数指针
       typedef void(*FUNC_TYPE)();
    
       FUNC_TYPE pFunc = func;
    
       pFunc();
    }
    
    void test03()
    {
        //直接定义函数指针变量
       void(*pFunc)() = func;
    
       pFunc();
    }
    
    //函数指针的数组
    
    void func1()
    {
       printf("func1的调用\n");
    }
    
    void func2()
    {
       printf("func1的调用\n");
    }
    
    void func3()
    {
       printf("func1的调用\n");
    }
    
    void text04()
    {
       //函数指针数组的定义
       void(*pFunc[3])();
       pFunc[0] = func1;
       pFunc[1] = func2;
       pFunc[2] = func3;
    
       for (int i = 0; i < 3; i++)
       {
            pFunc[i]();
        }
    }
    
    int main()
    {
       test01();
       test02();
       test03();
       text04();
    
       system("pause");
        return EXIT_SUCCESS;
    }
    

    函数指针做函数参数(回调函数)
    提供一个通用的函数,可以打印任意的数据类型

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    //提供一个函数,可以讲任意的数据类型 打印出来
    void printText(void* a, void(*myPrint)(void *))
    {
        myPrint(a);
    }
    
    void myPrintInt(void* data)
    {
       int* num = data;
       printf("%d\n", *num);
    }
    
    void myPrintPersion(struct Persion* data)
    {
       struct Persion *p = data;
        printf("姓名: %s 年龄: %d\n", p->name, p->age);
    
    }
    
    void test01()
    {
       int a = 100;
        printText(&a, myPrintInt);
    }
    
    void test02()
    {
       struct Persion p = { "aaa", 23 };
       printText(&p, myPrintPersion);
    }
    
    struct Persion
    {
       char name[64];
        int age;
    };
    
    void main()
    {
       test01();
       test02();
    
       system("pause");
       return EXIT_SUCCESS;
    }
    

    回调函数案例

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    struct Person
    {
       char name[65];
       int age;
    };
    
    //1.提供一个函数,可以打印任意类型的数组
    void printAllArray(void* arr,int eleSize, int len,void(*myFunc)(void*))
    {
    char* p = arr;
    for (int i = 0; i < len; i++)
    {
        char* eleAddr = p + i * eleSize; //计算每个元素首地址
        //printf("%d\n",*(int*)eleAddr);
        myFunc(eleAddr);
    }
    }
    
    //参数1 数组首地址 参数2 每个元素占得内存空间 参数3 元素个数 参数
    4 查找的元素的地址 参数5 回调函数
    
    int myFindPerson(void* arr, int eleSize, int len, void* data, int(*myCompare)(void*,void*))
    {
    char* p = arr;
    for (int i = 0; i < len; i++)
    {
        char* eleAddr = p + i * eleSize;//获取每个元素的首地址
    
        //if(eleAddr 和 data 的元素 相等)
        if (myCompare(eleAddr, data))
        {
            return 1;
        }
    }
    return 0;
    }
    
    void myPrintInt(void* data)
    {
    int* num = data;
    printf("%d\n", *num);
    }
    
    void myPrintPerson(void* data)
    {
      struct Persion* p = data;
      printf("姓名: %s 年龄: %d\n", p->name, p->age);
    }
    
    int myComparePerson(void* data1, void* data2)
    {
    struct Person* p1 = data1;
    struct Person* p2 = data2;
    
    if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age)
    {
        return 1;
    }
    return 0;
    }
    
    
    void test01()
    {
        int arr[5] = { 12, 3, 4, 5, 6 };
        int len = sizeof(arr) / sizeof(int);
        printAllArray(arr, sizeof(int),len,myPrintInt);
     }
    
     void test02()
    {
    struct Person pArray[] =
    {
        { "aaa", 10 },
        { "bbb", 20 },
        { "ccc", 30 },
        { "ddd", 40 },
    };
    int len = sizeof(pArray) / sizeof(struct Person);
    printAllArray(pArray, sizeof(struct Person), len, myPrintPerson);
    }
    
    void test03()
    {
    struct Person pArray[] =
    {
        { "aaa", 10 },
        { "bbb", 20 },
        { "ccc", 30 },
        { "ddd", 40 },
    };
    
    struct Person p = { "ccc", 30 };
    int len = sizeof(pArray) / sizeof(struct Person);
    //查找数组中的元素,如果查找到返回1 找不到返回0
    int ret = myFindPerson(pArray, sizeof(struct Person), len, &p, myComparePerson);
    
    if (ret)
    {
        printf("找到了元素\n");
    }
    else {
        printf("未找到了元素\n");
    }
    }
    
    
    
    int main() {
    test01();
    test02();
    test03();
    
    system("pause");
    return EXIT_SUCCESS;
    }
    

    相关文章

      网友评论

        本文标题:C语言基础---函数指针和回调函数

        本文链接:https://www.haomeiwen.com/subject/fenomftx.html