在C語言中,函數名也是指針變量,比如創建了一個add(int n,int m)的函數的同時也創建了一個名為add的指針變量,因此我們可以把函數指針當作一種類型為它賦值、當作參數傳遞等操作
C語言創建函數指針的公式:
返回類型 (*指針變量)(參數類型)
1 #include <stdio.h>
2
3 int add(int n,int m){
4 return n+m;
5 }
6
7 int sub(int n,int m){
8 return n-m;
9 }
10
11 int main(){
12 int n=10;
13 int m=5;
14 int (*calculate)(int,int);//創建一個名為calculate的變量
15 calculate=add;
16 int result=calculate(n,m);//相當於add(n,m);
17 printf("%i\n",result);
18 calculate=sub;
19 result=calculate(n,m);//相當於sub(n,m);
20 printf("%i\n",result);
21 return 0;
22 }
雖然函數指針是指針,但是在使用的時候我們可以省略"*"的寫法比如上面的calculate(n,m),我們不必寫成(*calculate)(n,m);需要注意的是函數指針只接受和它的返回值和參數都相同的函數地址
1 #include <stdio.h>
2
3 enum response_type{DUMP,SECOND_CHANCE,MARRIAGE};
4 typedef struct{
5 char *name;
6 enum response_type type;
7 } response;
8
9 void dump(response r){
10 printf("dump %s\n",r.name);
11 }
12
13 void second_chance(response r){
14 printf("second_chance %s\n",r.name);
15 }
16
17 void marriage(response r){
18 printf("marriage %s\n",r.name);
19 }
20
21 int main(){
22 response r[]={{"Mike",DUMP},{"Luis",SECOND_CHANCE},{"Matt",SECOND_CHANCE},{"William",MARRIAGE}};
23 void (*replies[])(response)={dump,second_chance,marriage};//創建函數指針數組
24 int i;
25 for(i=0;i<4;i++){
26 replies[r[i].type](r[i]);
27 }
28 return 0;
29 }