C语言函数型指针与指针型函数辨析
指针型函数
指针型函数指的是函数的返回值是指针类型。
例如
int* miltd(int* a,int b){
*a=(*a)*b;
//返回的是int型指针
return a;
}
函数型指针
函数型指针是一个指向函数入口地址的指针。
函数型指针可以作为参数传递,在C语言排序函数qsort和C++STL的sort函数,优先队列priority_queu都有使用,所以很有必要学习,具体应用参见后面的文章。
定义
函数返回值 (*函数型指针名称)(函数形式参数)= 函数入口地址;
调用
函数型指针名称(函数实际参数);
注意
函数名字在作为右值时会发生隐式类型转换,相当于函数的入口地址。
所以fun在作为右值时和&fun完全等同。(类似的隐式类型转换也发生在数组名上,数组名作为右值相当于数组的入口地址。)
所以下面的写法完全等同
函数型指针第一种写法(常用写法)
#include <stdio.h>
void fun(int a){
printf("Value of a is %d\n", a);
}
int main(){
// fun_ptr是一个指针,指向函数的入口地址
//定义函数型指针
void (*fun_ptr)(int) = fun;
//使用
fun_ptr(10);
return 0;
}
函数型指针的第二种写法
int main(){
void (*fun_ptr)(int) = &fun;
//解引用不是必须的
(*fun_ptr)(10);
return 0;
}
甚至可以这样写
运行结果也是一样的
int main(){
void (*fun_ptr)(int) = &fun;
//可以不解引用
fun_ptr(10);
return 0;
}
应用:指针型函数作为参数传递
#include <stdio.h>
//两个函数
void fun1() { printf("Fun1\n"); }
void fun2() { printf("Fun2\n"); }
//wrapper函数以函数指针作为参数
void wrapper(void (*fun)()){
fun();
}
int main(){
//传入不同的函数名字
wrapper(fun1);
wrapper(fun2);
return 0;
}

浙公网安备 33010602011771号