多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 函数指针 一个函数在编译的时候被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址 函数的三要素: 名称,参数,返回值.C语言智能函数有自己特定的类型 c语言通过typedef为函数类型重命名 ~~~ typedef int f(int, int); //f为函数类型 typedef void p(int); //p为函数类型 ~~~ # 定义函数类型 ~~~ int myfunc(int a, char b) { printf("myfunc\n"); return 0; } int main() { //定义函数类型,通过类型来定义函数指针 typedef int(FUN_TYPE)(int, char); FUN_TYPE *pFunc = myfunc; pFunc(10, '2'); (*pFunc)(20, '1'); myfunc(11, 's'); getchar(); return 0; } ~~~ # 定义函数指针类型 ~~~ int myfunc(int a, char b) { printf("myfunc\n"); return 0; } int main() { //定义函数指针类型 typedef int(*FUN_P)(int, char); FUN_P pFunc2 = myfunc; pFunc2(10, '2'); getchar(); return 0; } ~~~ # 函数指针 ~~~ int con1(int a, int b) { return a + b; } int con2(int a, int b) { return a - b; } int main() { int (*pFunc)(int, int) = con2; int ret = pFunc(10, 20); printf("%d\n", ret); getchar(); return 0; } ~~~ # 函数指针做函数参数 **可以做回调函数** ~~~ typedef void(*print_type)(void *); ~~~ ~~~ int con1(int a, int b) { return a + b; } int con2(int a, int b) { return a - b; } void doLogic(int (*pFunc)(int, int)) { int a = 10; int b = 20; int ret = pFunc(a, b); printf("%d\n", ret); } int main() { doLogic(con1); getchar(); return 0; } ~~~ # 函数指针数组 ~~~ void func1() { printf("func1\n"); } void func2() { printf("func2\n"); } void func3() { printf("func3\n"); } int main() { void (*func_array[3])(); func_array[0] = func1; func_array[1] = func2; func_array[2] = func3; for (int i = 0; i < 3; ++i) { func_array[i](); } getchar(); return 0; } ~~~ # 函数指针做参数的例子 ~~~ typedef void(*print_type)(void *); void printAllArray(void *arr, int eleSize, int len, print_type print) { char *start = (char *) arr; for (int i = 0; i < len; ++i) { char *eleAddr = start + i * eleSize; print(eleAddr); } } void MyPrint(void *data) { int *p = (int *) data; printf("%d \n", *p); } struct Person { char name[64]; int age; }; void MyPrintPerson(void *data) { struct Person *person = (struct Person *) data; printf("Name:%s Age:%d\n", person->name, person->age); } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7}; printAllArray(arr, sizeof(int), 7, MyPrint); struct Person persons[] = { {"aaa", 10}, {"bbb", 20}, {"ccc", 30}, }; printAllArray(persons, sizeof(struct Person), 3, MyPrintPerson); getchar(); return 0; } ~~~