学习函数指针的笔记

 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 }
原文地址:https://www.cnblogs.com/zanzan101/p/3326542.html