[2]简述:(C语言)指针

目录

【1】函数指针

                    【2】函数指针数组


【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;
}

相比于用分支实现:少了工作量也,以后增加其他函数也简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值