1 int add(int a,int b) 2 { 3 return a + b; 4 } 5 6 int fun(int(*funcAdd)(int x,int y)){ //函数指针.定义一个契约,约定了返回值,输入参数的类型等. 7 return funcAdd(5,6); 8 } 9 10 int main(int argc, char** argv) { 11 int value = fun(add); 12 std::cout<<value<<std::endl; 13 return 0; 14 }
int Oper(int (*MyPointerFuncAdd)(int a,int b))
{
int c=MyPointerFuncAdd(5,6);//间接调用
}
实现了函数调用和任务的编写可以分开。
这样的话,这要是这个函数类型的函数,传入不同的函数名,就能执行不同的函数体,用这种方法实现了类似于C++中的多态的形式。
在工程中,函数指针主要是正向调用和反向调用
其中正向调用指的是从函数体写在动态库中,在动态库中定义函数时,
、都把定义成函数指针类型的。
此时在外面定义一个函数指针变量,通过一个函数就能够把这个函数的首地址取出来,就可以根据这个被赋值以后的变量调用这个函数。这就是正向调用
反向调用(回调函数)的用途非常大
动态库==》框架
在实际工程中有时一个产品为了适应多个第三方厂商的产品,会给第三方厂商提供一个动态库写成的框架,让厂商们都根据这个框架去开发产品,在动态库里就只是单纯的调用这个函数,在动态库里不写任何函数体,这样就可以适配各个厂商的功能函数。
框架一般是不会变化的,将动态库里面的函数都写成函数指针类型的,在函数体里,再次调用这个函数,这样在动态库里就会回调厂商提供的功能函数。
回调函数是利用函数指针实现的一种调用机制
回调机制原理
当具体时间发生时,调用者通过函数指针调用具体函数
回调机制将调用者和被调函数分开,两者互不依赖。