目录
【1】函数指针
看下面函数指针代码,发现有什么不同。
[1]对于函数指针而言有无(&)根本不重要。&test 跟 test2 比较。。
[2]对于传参上去的指针有无(*)也不重要。pt1 跟 (*pt) 比较。。
[3]对于传参而言(只需要知道类型就好了,不需要形参名)。(int x, int y) 跟(int,int) 比较
[4]但是对于函数指针的写法还是有所区别的。
指针变量名要先与*先结合,再跟函数结合,才是一个合格的函数指针(优先级问题):如下
[5]好了,现在想必你应该会写一个函数指针了。
【2】函数指针数组
[1]函数指针数组:函数指针指向数组: 如下图:
函数指针的函数都一一指向数组:下面(转移表)计算器可以看出来。
也是一个优先级问题:如果你们不会看优先级可以 右左结合 即从右往左看结合一个拿一个出来
[2]函数指针数组一般用途是 :转移表
例如:计算器代码如下
#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;
}
分支实现计算器:
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");
breark;
default:
printf( "选择错误\n" );
break;
}
} while (input);
return 0;
}
看起来很雍总,很多代码都是重复运行即计算,浪费空间
函数指针实现计算器:
ina main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input <= 4 && input >= 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
相比于用分支实现:少了工作量也,以后增加其他函数也简单。