目录
一.函数指针
什么时候函数指针哇?
没错, 就是指向函数的指针。函数也有地址的嘛?
当然啦,当然啦,一起来看看
看,这不就是函数的地址
函数指针的写法详解:
来验证一下:
编译顺利通过,写法正确~~。
来看两串套娃的代码叭~
第一串
(* ( void(*)() ) 0)();
我的天,上面这是个什么玩意??
别急,一点一点来分析它!!
第二串
void (* signal (int , void (*) (int))) (int);
整个一个憨憨脸
*/..?@$%@........
这串代码什么意思呢?
那既然正确的写法这么难理解,我们能不能将这段代码简化一下,让它可读性更高呢?
那这段代码阅读障碍在哪里呢?
是不是主要在函数指针那里呀,那我们想个办法给它起个别名,换个马甲,不就ok了嘛?
改造代码,使可读性更高。
void(*signal(int, void(*)(int)))(int);
//typedef void(*)(int) easy;//思路是这么走的,但是正确的东西不按套路出牌,你看,编译器有提示啦
typedef void(* easy)(int); //诶,这下妥啦
//接下来,改造代码,走
easy signal(int, easy);
我们再来看一串代码,分析一下函数指针的用法。
来看一下打印后的结果。
但是这里要注意一点
二.函数指针数组
顾名思义,函数指针数组,一个存放函数的地址的数组。
我们来看看函数指针数组怎么用?
上代码,直观感受。
运行一下看看
我们再来实现一下“计算器”感受一下函数指针数组的便利性
使用函数指针数组解决
源码如下:
void menu()
{
printf("******************************\n");
printf("*****1.Add 2.Sub*****\n");
printf("*****3.Mul 4.Div*****\n");
printf("************0.exit************\n");
}
int Add(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()
{
int input = 0;
int x = 0;
int y = 0;
int(*parr[])(int, int) = { 0, Add, Sub, Mul, Div };
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个操作数:>");
scanf("%d%d", &x, &y);
int ret = parr[input](x, y);
printf("%d\n", ret);
}
else if (input == 0)
{
printf("退出\n");
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
三.指向函数指针数组的指针
一只菜鸟在永不停歇的向前顾涌....
慢慢亦漫漫