在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值、当作参数传递等操作
C语言创建函数指针的公式:
返回类型 (*指针变量)(参数类型)
#include <stdio.h> int add(int n,int m){
return n+m;
} int sub(int n,int m){
return n-m;
} int main(){
int n=;
int m=;
int (*calculate)(int,int);//创建一个名为calculate的变量
calculate=add;
int result=calculate(n,m);//相当于add(n,m);
printf("%i\n",result);
calculate=sub;
result=calculate(n,m);//相当于sub(n,m);
printf("%i\n",result);
return ;
}
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoYAAAAoCAIAAADsYayZAAABUElEQVR4nO3bwU3DMBSAYa/EJBwIwzBKOgfcOwPTPFUcOABqRONUkRr7Nf0+5ZZDrFx+OS8ur4fTz/Xx+fX0/Fbux3Fi3w/dMe9zmfcDjyMiyv0mGQB2Q5IBIAVJBoAUJBkAUpBkAEhhKcn//vA8Xmi8VgDYsWqSL6MrwwCwnZkk1/bBkgwA27FLBoAUVifZIBkAtrAiyVOqDAC3FRFlkGQA6O03ycPKWbIkA8BtzSR54fyxWTIAbKS6SwYAWpJkAEhBkgEghXOSh8PpXZIBoBNJBoAUJBkAUoiIMoySDACd/SV5PCd54VwyALCRapJ7LwwAHsskyaMkA0A3kgwAKVSTbJAMAC3NJHl6W5UBoA1JBoAUrsySJRkA2pjfJZslA0BjVz5cAwBtSDIApCDJAJCCJANACpIMAClIMgCkIMkAkIIkA0AKEVFeJBkAeouIb47Kvp70dRa6AAAAAElFTkSuQmCC" alt="" />
虽然函数指针是指针,但是在使用的时候我们可以省略"*"的写法比如上面的calculate(n,m),我们不必写成(*calculate)(n,m);需要注意的是函数指针只接受和它的返回值和参数都相同的函数地址
函数指针数组
#include <stdio.h> enum response_type{DUMP,SECOND_CHANCE,MARRIAGE};
typedef struct{
char *name;
enum response_type type;
} response; void dump(response r){
printf("dump %s\n",r.name);
} void second_chance(response r){
printf("second_chance %s\n",r.name);
} void marriage(response r){
printf("marriage %s\n",r.name);
} int main(){
response r[]={{"Mike",DUMP},{"Luis",SECOND_CHANCE},{"Matt",SECOND_CHANCE},{"William",MARRIAGE}};
void (*replies[])(response)={dump,second_chance,marriage};//创建函数指针数组
int i;
for(i=;i<;i++){
replies[r[i].type](r[i]);
}
return ;
}