函数指针:如果在程序中定义了一个函数,编译时系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
函数名就是地址
定义一个函数指针:
与 定义一个普通变量一样,定义函数:int getData(int a,int b);
定义函数指针:int (*p)(int a,int b);
注意:定义一个函数变量时要加上括号(),因为括号的优先级高于*符号,如果写成int * p(int a,int b); ,那么表达的意思是p为一个函数,取出p函数返回地址的值,就是指针函数,返回的是指针值的函数。
函数指针的访问:
①直接访问:变量名(函数名)
void (*p)();
②间接访问:指针(函数指针)
(*p)();
为什么要用函数指针:
①根据程序运行过程中不同情况,调用不同函数
②回调函数的底层逻辑:线程,QT的信号与槽
案例:有两个数a、b,用户输入1,2,3分别取a、b大值、小值、求和。
#include <stdio.h>
#include <stdlib.h>
int getMax(int data1,int data2){
return data1>data2 ? data1:data2;
}
int getMin(int data1,int data2){
return data1<data2 ? data1:data2;
}
int getPlus(int data1,int data2){
return data1+data2;
}
int getHandle(int data1,int data2,int (*func)(int data1,int data2)){
int ret;
ret = (*func)(data1,data2);
return ret;
}
int main(){
int a = 10;
int b = 20;
int cmd;
int ret;
printf("请输入1(取大值),2(取小值),3(求和)\n");
scanf("%d",&cmd);
int (*func)(int data1,int data2);
switch(cmd){
case 1:
func = getMax;
break;
case 2:
func = getMin;
break;
case 3:
func = getPlus;
break;
default:
printf("请输入正确的选项\n");
exit(-1);
break;
}
ret = getHandle(a,b,func);
printf("ret = %d\n",ret);
return 0;
}