回调函数案例

内置数据类型:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址   参数2:数组中每个元素的大小  参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
    
    
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
	char* p = (char*)array;
	for (int i = 0; i < len; i++)
	{
    
    
		//获取数组中每个元素的首地址----指针的步长
		char* eleAddr = p + size * i;
		//MyPrint(array[i]);是错误的----没有void*数组的概念 
		MyPrint(eleAddr);
	}
}
void myPrint(void* data) 
{
    
    
	int* num = (int*)data;
	printf("%d ", *num);
}
void test()
{
    
    
	int arr[5] = {
    
     1,2,3,4,5 };
	int len=sizeof(arr) / sizeof(arr[0]);
	printArray(arr, sizeof(int), len, myPrint);
}
int main()
{
    
    
	test();
	return 0;
}

在这里插入图片描述
自定义数据类型:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址   参数2:数组中每个元素的大小  参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
    
    
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
	char* p = (char*)array;
	for (int i = 0; i < len; i++)
	{
    
    
		//获取数组中每个元素的首地址----指针的步长
		char* eleAddr = p + size * i;
		//MyPrint(array[i]);是错误的----没有void*数组的概念 
		MyPrint(eleAddr);
	}
}
struct person {
    
    
	char ch[32];
	int age;
};
void myPrint(void* data) 
{
    
    
	person* p = (person*)data;
	printf("姓名:%s\t年龄:%d\n", p->ch, p->age);
}
void test()
{
    
    
	person p[5] = {
    
    
		{
    
    "大忽悠",18},
		{
    
    "小忽悠",18},
		{
    
    "小朋友",19},
		{
    
    "大朋友",19},
		{
    
    "happy end",100},
	};
	printArray(p, sizeof(person), 5, myPrint);
}
int main()
{
    
    
	test();
	return 0;
}

在这里插入图片描述
增加查找的功能:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//查找元素
//参数1:数组首地址   参数2:数组中每个元素的大小  参数3:数组元素个数 参数4:查找的元素
//参数5:回调函数,将data传入回调函数,更据用户需求进行对比操作,对比函数由用户自己写
int findArrEle(void* arr, int size, int len, void* data,int(*compare)(void*,void*))
{
    
    
	//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
	char* p = (char*)arr;
	for (int i = 0; i < len; i++)
	{
    
    
		//获取数组中每个元素的首地址----指针的步长
		char* eleAddr = p + size * i;

		if (compare(eleAddr,data))
		{
    
    
			return 1;
		}
	}
	return 0;
}

struct person {
    
    
	char ch[32];
	int age;
};
//对比的函数
int compare(void*eleAddr, void*data)
{
    
    
	person* p1 = (person*)eleAddr;
	person* p2 = (person*)data;
	if (strcmp(p1->ch,p2->ch)==0 && p1->age == p2->age)
	{
    
    
		return 1;
	}
	return 0;
}
void test02()
{
    
    
	person p[5] = {
    
    
		{
    
    "大忽悠",18},
		{
    
    "小忽悠",18},
		{
    
    "小朋友",19},
		{
    
    "大朋友",19},
		{
    
    "happy end",100},
	};
	person p1 = {
    
     "大忽悠",18};
	int ret=findArrEle(p, sizeof(person), 5, &p1, compare);
	if (ret==1)
		printf("查到");
	else
		printf("没查找到");
}
int main()
{
    
    
	test02();
	return 0;
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_53157173/article/details/114132706