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

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

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include

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
#include
#include

//提供一个函数,可以讲任意的数据类型 打印出来
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
#include
#include

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语言基础---函数指针和回调函数)