函数指针
先给个定义
就是函数的....指针-- 这他妈不废话吗---
就是函数的内存地址!!例如
//先定义一个函数,显示一个弹窗
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的回调简单多了,因为这里,相当于可以直接传一个函数进去!