什么是函数指针数组?
之前有说过指针数组,里边存放的是一群相同类型的指针,函数指针数组是它的自己,那群指针指向的是参数和返回类型相同的函数。
如何表示函数指针数组?
了解这个之前,要先了解一些符号的优先级,*<[]<()。现在我们先回顾一下函数指针是怎么来的
int test (int a,int* b){}
int *p1; //定义了一个整型指针变量p1
int (*p)(int ,int*);//定义了一个函数指针变量p
//先找名字 p
//p先和*结合表示是一个指针
//再和()结合表示该指针指向函数
//再和,int int*结合表示函数有两个类型的参数
//再和int 结合表示函数返回值是int类型
再来看看函数指针数组
int (*p[4])(int ,int*); //定义了一个数组,数组内应存放函数指针
//先找名字,p
//由于结合性的问题,p先和【】结合表示p是一个数组
//再和*结合表示存放的是指针
//再和()结合表示指针指向的是函数
函数指针数组的用处
函数指针数组就是相当于一个转移的作用,看一段加减乘除的代码
#include<stdio.h>
#include<stdlib.h>
//打印菜单
void menu(void) {
system("cls");
printf("*******************\n");
printf("**1.sum 2.sub***\n");
printf("**3.mul 4.div***\n");
printf("*****0.eixt********\n");
printf("*******************\n");
}
int sum(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x - y;
}
int mul(int x, int y) {
return x * y;
}
int Div(int x, int y) {
return x / y;
}
int main(void) {
int (*parr[5])(int, int) = { 0,sum,sub,mul,Div };
int input = 1;
int x=0, y=0;
do {
menu();
printf("%d\n", parr[input](x, y));
printf("请输入操作:\n");
scanf_s("%d", &input);
if (input >= 1 && input <= 4) {
printf("请输入两个操作数:\n");
scanf_s("%d%d", &x, &y);
}
else if (input == 0) {
printf("游戏退出\n");
break;
}
else {
printf("选择错误\n");
}
} while (input);
return 0;
}
回调函数
回调函数,就是把函数的地址作为参数传入一个函数
回调函数就是先将某个函数的地址传入其中,然后再被传入函数中看情况调用它
void refun(int (*pr)(int,int)); //函数指针类型作为参数的refun函数