编译器: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!请按任意键继续. . .