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 ", 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 ", func_ptr(i, k)); 58 printf("%d ", my_sum_ptr(i, k)); 59 printf("%d ", result_ptr(i, k)); 60 printf("%d ", 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 }