函数指针

2017-08-20  本文已影响0人  贝克街的猫大哥呀

先给个定义

就是函数的....指针-- 这他妈不废话吗--- 

就是函数的内存地址!!例如


 //先定义一个函数,显示一个弹窗

void showMessage(char* title, char* message){

         MessageBox(0,message,title,0);

}

void main(){

         void(*fun_p)(char* title, char* message) = showMessage;

         fun_p("标题","测试");

         system("pause");

}


关键代码是:void(*fun_p)(char* title, char* message) = showMessage;

可以看出,这里直接将 showMessage这个函数的地址赋值给了fun_p 这个定义的函数指针

为什么这里不需要 &showMessage 这样来存地址呢? 其实这样写也行,不写&也行,都是表示的方法的内存地址

再来看看函数指针是怎么定义的,void表示函数指针的返回值 ,第一个括号里是方法名,第二个括号里是参数名!

这样调用 fun_p("标题","测试"); 就跟调用showMessage方法一样。

关键问题来了!函数指针有什么用,看下面的示例:



int mix(int a,int b){

     return a - b;

}

int add(int a,int b){

     return a + b;

}

void msg(int(*fun_p)(int a,int b),int m,int n){

     int a=fun_p(m, n);

    printf("最终输出的值:%d", a);

}

void main(){

   msg(add,1,2);

   msg(mix, 1, 2);

   system("pause");

}


msg方法为关键,里面的参数就是一个函数指针。 这个参数里面,定义了返回值,以及参数。在main方法中,符合这个定义的函数,都可以当成函数指针传进去!! 

看到msg(add,1,2); 这个方法,将add方法传入,不是传指针吗,怎么直接传了add呢。 这跟上面的问题是一样的。&add也可以,直接输add也行,因为add代表的,就是它本身的内存地址!

现在就很明显了,这个作用,就相当于JAVA中的,回调!但比JAVA的回调简单多了,因为这里,相当于可以直接传一个函数进去!

上一篇下一篇

猜你喜欢

热点阅读