函数指针数组与回调函数
函数指针数组及应用
指针数组
首先从名字就可以知道这是一个数组,是存放指针的数组。
因为 [ ] 的优先级是高于 * 的,所以数组名会先于 [ ] 相结合组成数组。 再于 int * / char *类型结合,组成存放该类型的数组。
int *p1[10];
char *p2[5];
char **p3[6];
数组指针
从名字看就知道是指针,是指向一个数组的指针。由数组指针知道 [ ] 的优先级是高于 * 的,所以用()来提升指针先结合。
int (*p)[10];
函数指针
指向函数的指针,通俗的说也就是函数的地址.p 先和*结合,说明p是指针,指针指向的是一个函数
也就是说 其可以保存函数的地址
int (*p)(int,int);
函数指针数组
p先与 [ ]结合,说明是一个数组,再与*结合,说明数组存放的是指针,指针都指向的是函数
函数指针数组的使用
int (*p[3])(int,int );
用函数指针数组输出最大值,最小值,和
三目运算法
也叫三元运算法
基本格式:(关系表达式)?表达式1:表达式2;
执行流程:关系表达式为 真 返回表达式1
#include <stdio.h>
int getMax(int data1,int data2)
{
return data1>data2?data1:data2; //三目运算法
}
int getMin(int data1,int data2)
{
return data1<data2?data1:data2;
}
int getSum(int data1,int data2)
{
return data1+data2;
}
int main()
{
int a = 20;
int b = 10;
int i = 0;
int ret;
int (*p[3])(int,int ) = {
getMax,
getMin,
getSum
};
for(i=0;i<3;i++){
ret = (*p[i])(a,b);
printf("ret = %d\n",ret);
}
return 0;
}
回调函数及应用
回调函数(常与函数指针连用)
通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
用回调函数实现选择(取最大值 取最小值 取和)
#include <stdio.h>
int getMax(int data1,int data2)
{
return data1>data2?data1:data2; // 三目运算法
}
int getMin(int data1,int data2)
{
return data1<data2?data1:data2;
}
int getSum(int data1,int data2)
{
return data1+data2;
}
int getRet(int a,int b,int (*p)(int,int)) // 回调函数
{
return (*p)(a,b);
}
int main()
{
int data1 = 10;
int data2 = 20;
int cmd;
int ret;
int (*p)(int,int);
printf("你要怎么玩:\n");
scanf("%d",&cmd);
switch(cmd){
case 1:
p = getMax;
break;
case 2:
p = getMin;
break;
case 3:
p = getSum;
break;
default:
printf("输入错误\n");
break;
}
ret = getRet(data1,data2,p);
printf("ret = %d\n",ret);
return 0;
}