回调函数案例

2021-03-04 10:35:54 浏览数 (1)

内置数据类型:

代码语言:javascript复制
#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;
}

自定义数据类型:

代码语言:javascript复制
#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("姓名:%st年龄:%dn", 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;
}

增加查找的功能:

代码语言:javascript复制
#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;
}

0 人点赞