18C语言深入浅出day6——回调函数

本文探讨了C语言中的函数指针,详细解释了如何定义和使用函数指针,特别是在回调函数中的应用。首先,介绍了函数指针的定义方式,包括直接定义和通过函数类型定义。接着,讲解了函数指针作为参数传递,实现回调功能,举例说明如何打印不同数据类型的回调函数。最后,通过案例展示了如何利用回调函数来打印任意类型数组和查找数组元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

08函数指针的定义

  • QT中打印地址不会改变,或者改变很小
  • 函数指针指向函数的地址 如何定义函数指针
  • 返回值 函数名 (参数列表) void
    (*pFuncPointer)(int) = (void(*)(int))4199952;
  1. 先定义函数类型,再通过类型定义出函数指针
typedef void(FUNC_TYPE)();
    FUNC_TYPE *pFunc = Func;
  1. 先定义出函数指针类型,再定义函数指针
 typedef void(*FUNC_TYPE)();
    FUNC_TYPE pFunc = Func;
  1. 直接定义函数指针变量
void(*pFunc)() = Func;
   pFunc();
  1. 函数指针的数组定义
  void (*pFunc[3])();

函数指针和指针函数的区别???
函数指针 是指向函数的 指针
指针函数 函数的返回值是一个指针的 函数
int * func();

代码:

#include <stdio.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("1\n");
}
void Func2()
{
    printf("2\n");
}
void Func3()
{
    printf("3\n");
}
void test04()
{
    int i;
    void (*pFunc[3])();
    pFunc[0] = Func1;
    pFunc[1] = Func2;
    pFunc[2] = Func3;
    for(i=0; i<3; i++)
    {
        pFunc[i]();
    }

}
int main()

{
    //test01();
    //test02();
   // test03();
   test04();
    return 0;
}

09函数指针做函数参数—回调函数

提供一个函数,可以将任意的数据类型 打印出来

代码:

#include <stdio.h>
void printText(void *data, void (*myPrint)(void *))
{
    myPrint(data);
}
void myPrintInt(void *data)
{
    int *num = data;
    printf("data=%d\n", *num);
}

void test01()
{
    int a = 100;
    printText(&a, myPrintInt);
}
struct Person
{
    char name[64];
    int age;
};
void myPrintStruct(void *data)
{
    struct Person *p = data;
    printf("name=%s, age=%d\n", p->name, p->age);
}
void test02()
{
    struct Person p = {"aaa", 21};
    printText(&p, myPrintStruct);
}


int main()
{
 //   test01();
    test02();
    return 0;
}

10回调函数案例

  1. 提供一个函数,可以打印任意类型的数组
  2. 提供一个查找数组中元素的函数
#include <stdio.h>
#include <string.h>

struct Person {
    char name[64];
    int age;
};
void printAllArray(void *arr, int eleSize, int len, void (*myFunc)(void *)) {
    int i;
    char *p = arr;
    for (i = 0; i < len; i++) {
        char *eleAddr = p + i * eleSize;
        myFunc(eleAddr);
    }
}
void myPrintInt(void *data) {
    int *num = data;
    printf("%d\n", *num);
}
void test01() {
    int arr[6] = {1, 2, 3, 4, 5, 6};
    int len = sizeof(arr) / sizeof(int);
    printAllArray(arr, sizeof(int), len, myPrintInt);
}
void myPrintPerson(void *data) {
    struct Person *p = data;
    printf("name=%s, age=%d\n", p->name, p->age);
}
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);
}
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;
}

//参数1 数组首地址 参数2 每个元素占的内存空间 参数3 元素个数 参数4 查找元素的地址 参数5 回调函数
int myFindPerson(void *arr, int eleSize, int len, void *data,
                 int (*myCompare)(void *, void *)) {
    char *p = arr;
    int i;
    for (i = 0; i < len; i++) {
        char *eleAddr = p + i * eleSize;//获取每个元素的首地址
        //if(eleAddr 和 data 的元素 相等)
        if (myCompare(eleAddr, data)) {
            return 1;
        }
    }

    return 0;
}
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("yes\n");
    } else {
        printf("no\n");
    }
}

int main() {
    // test01();
    // test02();
    test03();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值