函数指针在本质上就是指针,是用来指向函数地址的指针。所以以下两种写法哪一种可以用来保存函数地址。
void test()
{
printf("dog\n");
}
void (*p)() = test();
void *p() = test();
答案是第一个 void(*p)()= test(),因为代码先运行括号中的*p使其相结合,所以p才是指针,指向一个 void 无返回值的函数,而第二种它是一个void * 类型函数,并不是函数指针。
如果这样使用函数指针,会有一种画蛇添足的感觉,那么在实际应用中它一般是如何应有的。
我们知道数组是用来存放相同类型的存储空间,就是指针数组是存放指针的数组。
例如:
int *arr[10];
这就是存放十个int * 类型的数组。
那么如果我们吧函数的地址存放于数组当中,那么便成为了函数指针数组,虽然有点绕口,但函数指针数组的本质就是数组。
函数指针数组的写法如下:
void m()
{
;
}
void n()
{
;
}
int main()
{
int (*p[2])() = {m,n};
return 0;
}
函数指针数组的用途:转移表
例子:计算机
#include<stdio.h>
void menu()
{
printf("************************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.exit ***\n");
printf("************************\n");
printf("************************\n");
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int a = 0;
int b = 0;
int input = 0;
int ret = 0;
do {
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("输入数据:\n");
scanf("%d %d", &a, &b);
printf("%d\n", add(a, b));
break;
case 2:
printf("输入数据:\n");
scanf("%d %d", &a, &b);
printf("%d\n", sub(a, b));
break;
case 3:
printf("输入数据:\n");
scanf("%d %d", &a, &b);
printf("%d\n", mul(a, b));
break;
case 4:
printf("输入数据:\n");
scanf("%d %d", &a, &b);
printf("%d\n", div(a, b));
break;
case 0:
printf("退出程序\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
如果使用函数指针数组实现:
#include<stdio.h>
void menu()
{
printf("************************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.exit ***\n");
printf("************************\n");
printf("************************\n");
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int a, b;
int (*p[5])(int a, int b) = {0,add,sub,mul,div};
int input = 1;
while (input)
{
menu();
scanf("%d", &input);
if (input <= 4 && input >= 1)
{
printf("输入数据:\n");
scanf("%d %d", &a, &b);
printf("%d\n", p[input](a, b));
}
else if (input == 0)
{
printf("退出程序\n");
break;
}
else
{
printf("输入错误\n");
}
}
return 0;
}
只有在返回类型和形参相同时,才可以使用函数指针数组。使用函数指针数组可以减少代码的冗余性,也方便后期的维护。