函数类型:

 

函数指针:

 

面试小问题:

如何使用C语言直接跳转到某个固定的地址开始执行?

函数指针的使用:

 1 #include <stdio.h>
 2 
 3 typedef int(FUNC)(int);
 4 
 5 int test(int i)
 6 {
 7     return i * i;
 8 }
 9 
10 void f()
11 {
12     printf("Call f()...\n");
13 }
14 
15 int main()
16 {
17     FUNC* pt = test;
18     void(*pf)() = &f;
19     
20     printf("pf = %p\n", pf);
21     printf("f = %p\n", f);
22     printf("&f = %p\n", &f);
23     
24     pf();
25     
26     (*pf)();
27     
28     printf("Function pointer call: %d\n", pt(2));
29     
30     return 0;
31 }

函数名取不取地址,它的意义是相同的,这和数组不一样。

运行结果如下:

 

知道了函数地址,我们在18行直接给函数名用地址赋值,结果如下:

 

我们可以得到结论,C语言中可以直接跳转到某个固定的地址执行。

 

回调函数:

 

回调函数示例:

 1 #include <stdio.h>
 2 
 3 typedef int(*Weapon)(int);
 4 
 5 void fight(Weapon wp, int arg)
 6 {
 7     int result = 0;
 8     
 9     printf("Fight boss!\n");
10     
11     result = wp(arg);
12     
13     printf("Boss loss: %d\n", result);
14 }
15 
16 int knife(int n)
17 {
18     int ret = 0;
19     int i = 0;
20     
21     for(i=0; i<n; i++)
22     {
23         printf("Knife attack: %d\n", 1);
24         ret++;
25     }
26     
27     return ret;
28 }
29 
30 int sword(int n)
31 {
32     int ret = 0;
33     int i = 0;
34     
35     for(i=0; i<n; i++)
36     {
37         printf("Sword attack: %d\n", 5);
38         ret += 5;
39     }
40     
41     return ret;
42 }
43 
44 int gun(int n)
45 {
46     int ret = 0;
47     int i = 0;
48     
49     for(i=0; i<n; i++)
50     {
51         printf("Gun attack: %d\n", 10);
52         ret += 10;
53     }
54     
55     return ret;
56 }
57 
58 int main()
59 {
60     fight(knife, 3);
61     fight(sword, 4);
62     fight(gun, 5);
63     
64     return 0;
65 }

运行结果如下:

 

函数指针的关键使用场合就是用来实现回调机制。

小结:

 

posted on 2018-08-28 21:50  周伯通789  阅读(222)  评论(0编辑  收藏  举报