见代码
1 #include <stdio.h>
2 typedef int (*Fun)(); //函数指针
3 struct student
4 {
5 int id;
6 Fun func; //函数指针,存放的应该是函数的入口地址
7 };
8
9 int fun1(int a)
10 {
11 printf("fun1\n");
12 }
13
14 int fun2(int a)
15 {
16 printf("fun2\n");
17 printf("a = %d\n",a);
18 return 0;
19 }
20
21 int fun3(int b)
22 {
23 printf("fun3\n");
24 return 0;
25 }
26
27 struct student tab[] =
28 {
29 {1,fun1},
30 {2,fun2},
31 {3,fun3},
32 {4,NULL}
33 // {5,fun5},
34 };
35
36 struct student *parse_func(int id) //通过id找出调用的哪个函数
37 {
38 int i;
39 for(i = 0; i<sizeof(tab)/sizeof(struct student); i++)
40 {
41 if(id == tab[i].id)
42 return &tab[i]; //返回数组地址
43 }
44 return NULL;
45 }
46
47 static int use1(int a)
48 {
49 struct student *p = NULL;
50 p = parse_func(a);
51 if((p != NULL)&&(p->func != NULL))
52 {
53 printf("p->func = %p\n",p->func);
54 p->func(); //调用该函数
55 // p->func(8); //调用该函数,虽然没有typedef没有定义,但是函数里可以放参数,这行也成立
56 }
57
58 }
59 int main()
60 {
61 printf("abc\n");
62 int a = 2; //a为参数,用于匹配tab数组的id,找到相应函数,通过不同的id参数值调用不同函数
63 use1(a);
64 }
运行结果为:
abc
p->func = 0x40057e
fun2
a = 1