上文我们谈到了函数指针这一节我们来看具体用法
1:函数指针数组
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,
比如:
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如定义呢?
int (*parr1[10])();
int *parr2[10]();
int (*)() parr3[10];
答案是:parr1
parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢?
是 int (*)() 类型的函数指针。
我们来看俩段代码
//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int)
第一个解释第二个解释
2实战演习
普通版
看到这么长的代码不要怕这就是一个计算机加减乘除功能分别选择一些选项达到功能,大家来看这段代码是不是相同地方非常多显得十分不好
就是这里面的case那我们用函数指针的思维来改进一下吧
#include <stdio.h>
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 x, y;
int input = 1;
int ret = 0;
do
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf("*************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
函数指针版本
#include <stdio.h> 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; } void col(int (*pf)(int, int)) { int x, y; int ret = 0; printf("输入操作数:"); scanf_s("%d %d", &x, &y); ret = (*pf)(x, y); printf("ret = %d\n", ret); } int main() { int input = 1; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("请选择:"); scanf_s("%d", &input); switch (input) { case 1: col(add); break; case 2: col(sub); break; case 3: col(mul); break; case 4: col(div); break; case 0: printf("退出程序\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
来看看其中那些发生了变化我用一个col函数他的参数是函数指针int(*pf)(int,int)的参数来接受这个 数据,然后通过传入不同的函数地址来达到不同的效果大大的节省了代码
函数指针数组版本
再来看里面的变化,我们使用函数指针数组以后在里面添加新的功能我们只需要再函数指针数组里边加一个然后再函数声明部分把函数实现出来就可以啦
#include <stdio.h> 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; } void meun() { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); } int main() { int x, y; int input = 1; int ret = 0; int input = 1; int (*pc[5])(int, int) = { 0,add,sub,mul,div };//转移表 do { meun(); printf("请选择:"); scanf_s("%d", &input); if (input == 0) { printf("退出计算器"); } else if (input >= 1 && input <= 4) { printf("请输入你的操作数"); scanf_s("%d %d", x, y); ret=(pc[input])(x, y); printf("ret = %d\n", ret); } else { printf("输入有误\n"); printf("ret = %d\n", ret); } } while (input); return 0; }