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 }