- 指针数组
int* arr[4];
- 函数指针
int add(int x, int y) {
return x + y;
}
// 函数指针
int(*p)(int,int) = add;
- 函数指针数组
如果此时不止一个add函数,还有sub函数和mul函数等等
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(*)(int, int)
这个函数指针类型当然也能存sub、mul、div- 如果想要把这几个函数都存起来,则需要函数指针数组,可以存放四个函数的地址。因为数组中要求数据类型都一样,而恰巧,这四个函数指针类型都是
int(*)(int, int)
int(*p[4])(int, int);
此时p和[]结合,说明p就是个数组了,把数组名和[4]去掉,剩下的就是数据类型,是个函数指针类型,所以这就是函数指针数组
- 初始化就是
// 初始化就是
int(*p[4])(int, int) = {add, sub, mul, div};
for (i = 0; i < 4; i++) {
p[i](2,3);// 依次调用加减乘除
}
函数指针数组的用途
比如实现一个计算器,需要加减乘除时,使用switch case
switch(input)
{
case 1:
add;
case 2:
sub;
...
}
- 如果还有左移右移等等,就会使这个代码变得复杂
- 首先我们使用函数指针数组,存放这几个函数
int(*parr[5])(int, int) = {0, add, sub, mul, div};
- 使用下标来进行对函数的选择使用,就不用使用switch case了,input 就是下标
- 通常把这个函数指针数组,叫做转移表,也就是说好像是通过这个数组,而转移调用了其他不同的函数。