回调函数案列(C高级)

编译器:vs2013

1.实质

其实回调就是一种利用函数指针进行函数调用的过程。 函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数

2.回调的思想

如果你有一个对数的操作,你现在还不知道是对它做加还是乘,还是别的什么运算。这个时候就可以定一个标准的函数框架,在调用的时候,将我要用的那个函数名作为参数传入,则进行相应的操作。

3.c代码

3.1 Callback01.c

打印任意类型的数组,先打印int类型,后打印自定义的结构体类型

#include <stdlib.h>
#include <stdio.h>
#define  _CRT_SECURE_NO_WARNINGS 

//INT回调
void myPrintInt(void *data)
{
	int *num = data;
	printf("%d\n", *num);
}

//void *arr万能指针,eleSize类型大小
//void(*myPrint)(void * data)
void printArray(void *arr, int eleSize, int len, void(*myFunc)(void * data))
{
	char *p = arr;
	for (int i = 0; i < len; i++)
	{
		char *eleArr = p + i*eleSize;//数组每一层的地址
		//printf("%d\n", *(int *)eleArr);%d确定不了,用回调函数
		myFunc(eleArr);
	}
}
//打印数组
void test01()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	int len = sizeof(arr) / sizeof(int);
	printArray(&arr, sizeof(int), len,myPrintInt);
}

//打印自定义结构体
struct Person
{
	char name[64];
	int age;
};
//结构体回调
void myPrintPerson(void *data)
{
	struct Person *p = data;
	printf("name:%s age:%d\n", p->name, p->age);
}
void test02()
{
	struct Person pArray[] = { { "aaa", 18 }, { "bbb", 19 }, { "ccc", 20 }, { "ddd", 21 } };
	int len = sizeof(pArray) / sizeof(struct Person);//几个赋值结构体4
	printArray(&pArray, sizeof(struct Person), len, myPrintPerson);

}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

3.2 结果显示
1
2
3
4
5
name:aaa age:18
name:bbb age:19
name:ccc age:20
name:ddd age:21
请按任意键继续. . .

在这里插入图片描述

3.3 Callback02.c
#include <stdlib.h>
#include <stdio.h>
#define  _CRT_SECURE_NO_WARNINGS 

struct Person
{
	char name[64];
	int age;
};

//回调
int myComparePerson(void *data1, void *data2)
{
	//指针类型转换
	struct Person *p1 = data1;
	struct Person *p2 = data2;
	//strcmp() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符
	if ((strcmp(p1->name, p2->name) == 0) && (p1->age == p2->age))
	{
		return 1;
	}
	else
		return 0;

}

//int myFind(void *arr, int eleSize, int len, void *data, void(*myCompare)(void *, void *))
//arr数组首地址  eleSize元素占的内存空间  data要查找元素的首地址
int myFind(void *arr, int eleSize, int len, void *data, int(*myCompare)(void *, void *))
{
	char *p = arr;
	for (int i = 0; i < len; i++)
	{
		char *eleArr = p + i*eleSize;//每个元素的首地址
		//比较里面的元素是否相同
		if (myCompare(eleArr, data))
		{
			return 1;
		}
	}
	return 0;
}

void test04()
{
	struct Person pArray[] = { { "aaa", 18 }, { "bbb", 19 }, { "ccc", 20 }, { "ddd", 21 }, { "eee", 22 } };
	struct Person p = { "aaa", 18 };//需要查找的
	int len = sizeof(pArray) / sizeof(struct Person);//几个赋值结构体4
	//printArray(&pArray, sizeof(struct Person), len, myPrintPerson);
	int return_value = myFind(&pArray, sizeof(struct Person), len, &p, myComparePerson);
	//判断
	if (return_value)
	{
		printf("Find the element!");
	}
	else
	{
		printf("Did not find the element");
	}
}

int main()
{
	test04();
	system("pause");
	return 0;
}

3.4 结果显示
Find the element!请按任意键继续. . .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐维康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值