什么是函数指针

函数指针,即指向函数的指针。

如果在程序中定义了一个函数,在编译时系统就会为这段函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,而且函数名表示的就是这个地址。

既然是地址我们就可以定义一个指针变量来存放,这个指针变量叫做函数指针变量,简称函数指针

函数指针定义

如:void fun(int i){},其类型为void (),定义指向该函数的指针为void (*p)(int i) = fun;

所以函数指针的定义方式为

函数返回值类型 (*指针变量名)(函数参数列表);

注意:*指针变量名两边的括号不能省略,如果省略了括号,就不是定义函数指针,而是一个函数声明了,即声明了一个返回值类型为指针的函数。

使用函数指针调用函数

如定义void (*p)(int i) = fun,调用fun函数:(*p)(10);

函数指针数组

既然函数入口地址是一个指针,那么就可以将函数指针放入指针数组中,然后作为函数指针调用。

 1 int add1(int a1, int a2);
 2 int add2(int a1,int a2);
 3 int main(void)
 4 {
 5     int numa1 = 1,numb1 = 2;
 6     int numa2 = 2, numb2 = 3;
 7     int(*op[2])(int a, int b);
 8     op[0] = add1;
 9     op[1] = add2;
10     op[0](numa1,numb1);
11     op[1](numa2,numb2);
12 }
13  
14 int add1(int a1, int a2)
15 {
16     Return a1 + b1;
17 }
18  
19 int add2(int a2, int b2)
20 {
21     Return a2+b2;
22 }

赋值

函数指针数组赋值有两种方式:静态定义和动态赋值

静态定义

在定义函数指针数组的时候,已经确定了每个成员所对应的函数,如:

1 Void(*Array[])(void)={Stop,Run,Jump};
2 Array[1]();//执行Run函数

动态赋值

预先定义一个函数指针数组,在需要的时候为其赋值

1 typedef void(*Funcint)(void);
2 Funcint Array[32];
3 Array[10]=INT_TIMER0;
4 Array[10]();

参考

c.biancheng.net/view/228.html

baike.baidu.com/item/函数指针/2674905?fr=aladdin

posted on 2019-08-23 15:11  AnotherICE  阅读(939)  评论(0编辑  收藏  举报