本文主要是介绍C高级编程 第十天(函数指针 回调函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1.函数指针
①先定义函数类型,再通过类型定义函数指针变量
②先定义函数指针的类型,再通过类型定义函数指针变量
③直接定义函数指针变量(重点)
2.回调函数
案例一:打印任意类型数据
案例二:打印任意类型数组
案例三:查找数组中的元素
1.函数指针
void func(int a, char b)
{printf("hello world");
}
①先定义函数类型,再通过类型定义函数指针变量
void test1()
{typedef void(FUNC_TYPE)(int, char);FUNC_TYPE* pFunc = func;pFunc(10, 'a');
}
②先定义函数指针的类型,再通过类型定义函数指针变量
void test2()
{typedef void(*FUNC_TYPE)(int, char);FUNC_TYPE pFunc = func;pFunc(20, 'b');
}
③直接定义函数指针变量(重点)
void test3()
{void(*p)(int, char) = func;p(30, 'c');
}
2.回调函数
案例一:打印任意类型数据
void myPrint(void* data,void(*mp)(void*))
{mp(data);
}struct Person
{int age;char name[64];
};void printInt(void* data)
{int* number = (int*)data;printf("%d\n", *number);
}void printDouble(void* data)
{double* number = (double*)data;printf("%f\n", *number);
}void printPerson(void* data)
{struct Person* number = (struct Person*)data;printf("姓名:%s,年龄:%d\n", number->name,number->age);
}int main()
{int a = 8;double b = 3.14;struct Person p = { 18,"ZJX"};myPrint(&a,printInt);myPrint(&b,printDouble);myPrint(&p,printPerson);return 1;
}
案例二:打印任意类型数组
void myPrint(void* data, void(*mp)(void*))
{mp(data);
}struct Person
{int age;char name[64];
};void printIntArr(void* data)
{int* number = (int*)data;for (int i = 0; i < 5; i++){printf("%d\n", number[i]);}
}void printDoubleArr(void* data)
{double* number = (double*)data;for (int i = 0; i < 5; i++){printf("%f\n", number[i]);}
}void printPersonArr(void* data)
{struct Person* number = (struct Person*)data;for (int i = 0; i < 5; i++){printf("姓名:%s,年龄:%d\n", number[i].name, number[i].age);}
}int main()
{int a[5] = {6,8,6,8,6};double b[5] = { 6.6,8.8,6.6,8.8,6.6 };struct Person p[5] ={{ 18,"ZJX" },{ 18,"ZZZ" },{ 18,"JJJ" },{ 18,"XXX" },{ 18,"XJZ" }};myPrint(&a, printIntArr);myPrint(&b, printDoubleArr);myPrint(&p, printPersonArr);return 1;
}
案例三:查找数组中的元素
int findArrayEle(void* array, int eleSize, int len, void* data,int(*compare)(void*,void*))
{char* arr = (char*)array;for (int i = 0; i < len; i++){char* arr1 = arr + eleSize * i;//数组中每个元素的首地址if (1 == compare(arr1, data)){return 1;}}return 0;
}struct Person
{int age;char name[64];
};int compare(void* a, void* b)
{struct Person* a1 = (struct Person*)a;struct Person* b1 = (struct Person*)b;if (strcmp(a1->age, b1->age) == 0 && strcmp(a1->name , b1->name)==0){return 1;}return 0;
}int main()
{struct Person p[5] ={{ 18,"ZJX" },{ 18,"ZZZ" },{ 18,"JJJ" },{ 18,"XXX" },{ 18,"XJZ" }};struct Person pFind = { 18,"XJZ" };int result=findArrayEle(p, sizeof(struct Person), sizeof(p) / sizeof(struct Person), &pFind,compare);
}
这篇关于C高级编程 第十天(函数指针 回调函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!