什么是函数指针
函数指针,即指向函数的指针。
如果在程序中定义了一个函数,在编译时系统就会为这段函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,而且函数名表示的就是这个地址。
既然是地址我们就可以定义一个指针变量来存放,这个指针变量叫做函数指针变量,简称函数指针。
函数指针定义
如: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函数
动态赋值
预先定义一个函数指针数组,在需要的时候为其赋值