1 int my_sum_func(int i, int k) 2 { 3 return i+k; 4 } 5 // 定义函数指针的两种方式 6 7 // 第一种:声明一个函数指针变量 8 int (*func_ptr)(int, int); 9 // (int(*)(int, int)) func_ptr; 这种声明方式不合法10 // 函数指针书写的几个要点:11 // 1 标识符前面加*12 // 2 (*标识符)(参数列表)13 // 3 最前面是返回值类型14 15 // 第二种:定义一个函数指针类型,再用这个类型去声明一个变量,本质上还是声明一个函数指针变量16 typedef int (*my_sum_func_ptr)(int, int);17 my_sum_func_ptr my_sum_ptr;18 // typedef (int(*)(int, int)) my_sum_func_ptr; 这种声明方式不合法19 20 // 扩展:如何返回函数指针21 void* get_func_ptr(int (*func)(int,int))22 {23 return func;24 }25 /*26 这种书写方式不合法,返回函数指针的时候,只能通过 void* 转换27 28 ((int*)(int,int)) get_func_ptr(int (*func)(int, int))29 {30 return func;31 }32 */33 34 void my_print_func(char* str)35 {36 printf("%s\n", str);37 }38 39 int main(int argc, char* argv[])40 {41 func_ptr = &my_sum_func; // 对函数指针变量赋值42 my_sum_ptr = &my_sum_func; // 对函数指针变量赋值43 int (*result_ptr)(int,int);44 result_ptr = (int(*)(int, int))get_func_ptr(func_ptr); // 注意:此处的类型转换一个括号也不能落下45 // 即:(int(*)(int,int)) 少一层括号就不对46 //函数数组47 my_sum_func_ptr func_ptr_array[2];48 func_ptr_array[0] = &my_sum_func;49 /*50 这种书写方式不合法,需要先转换类型:51 52 func_ptr_array[1] = (int(*)(int, int))&my_print_func; 53 */54 func_ptr_array[1] = (int(*)(int, int))&my_print_func;55 int i = 2;56 int k = 3;57 printf("%d\n", func_ptr(i, k));58 printf("%d\n", my_sum_ptr(i, k));59 printf("%d\n", result_ptr(i, k));60 printf("%d\n", func_ptr_array[0](i, k));61 /*62 当使用错误的函数指针调用函数时,会出现运行时错误:63 例如:64 func_ptr_array[0] = (int(*)(int, int))&my_print_func;65 func_ptr_array[0](i, k)); //这一句话会产生运行时错误66 */67 68 char* str = "Hello World !";69 70 void (*my_print_ptr)(char* str);71 my_print_ptr = &my_print_func;72 my_print_ptr(str);73 my_print_ptr = (void(*)(char*))func_ptr_array[1]; //这里需要再转换回来74 my_print_ptr(str);75 76 77 getchar();78 return 0;79 }