美文网首页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语言基础---函数指针和回调函数

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

  • 函数指针之回调函数和转移表

    函数指针之回调函数和转移表 《C和指针》261页函数指针的用途: 对不同的数据类型作相同的操作->回调函数 对相同...

  • C语言基础及指针⑤动态内存分配

    接续上篇C语言基础及指针④函数指针 在上一篇我们了解C语言中的函数及函数指针 , 使用函数指针 , 模拟了网络请求...

  • C语言函数指针和指针函数

    C语言函数指针和指针函数 在学习C语言的过程中,“指针函数”和“函数指针”经常容易搞混了, 最简单的辨别方式就是看...

  • C语言基础知识点

    函数指针与回调函数 1、函数指针:函数指针是指向函数的指针变量,以下实例声明了函数指针变量 p,指向函数 max:...

  • javascript回调函数、递归函数

    javascript回调函数、递归函数 一、回调函数 通过函数的指针来调用函数(把一个函数的指针作为另一个函数的参...

  • Node.js-回调函数

    回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被...

  • JS 回调函数浅析

    回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被...

  • C语言基础及指针④函数指针

    接续上篇C语言基础及指针③函数与二级指针 在上一篇中 , 我们学习了函数与二级指针 , 函数和java中的方法类似...

  • 【c++】函数 函数指针 指针函数 函数指针typedef 回调

    函数指针 https://www.cnblogs.com/mrsandstorm/p/6150092.html

网友评论

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

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