指针应用–计算器的实现
一。简介:
在准备写计算器实现的代码前,我们需要了解一些关于函数指针和函数指针数组的知识,还有很多关于指针的知识,如有需要请看之前的博客“c语言指针”
二。函数指针:
(1)概念:
先进行一组类比:
字符指针–指向字符–存放字符的地址
整形指针–指向整形–存放整形的地址
数组指针–指向数组–存放数组的地址
那么我们可以推断出来函数指针–指向的是函数,存放的是函数的地址
(2)写法
函数指针的写法与数组指针相似:
数组指针:int (*pa)[10]=&arr
函数指针:int (*pa)(int,int)=&Add
int Add(int a,int b)
{
return a+b;
}
int main()
{
printf("%p\n",&Add);
printf("%p\n",Add);
return 0;
}
最后输出结果发现两个是一样的
因此,我们可以推断出&函数名和函数名都表示函数的地址
(3)函数指针变量的使用:
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pr)(int ,int )=Add;
printf("%d\n",(*pr)(2,3))//也可以写成pr(2,3)
return 0;
}
下面进行分析:int (*pr)(int ,int )=Add;这段的意思是把Add函数的地址存放在pr里
printf(“%d\n”,(*pr)(2,3))这句的意思是,对pr进行解引用,找到Add函数的运算方式,然后把想要计算的值输入其中就可以实现函数的调用
三。函数指针数组
(1)定义:
把函数的地址存放到数组里,这个数组就叫作函数指针数组
(2)举例:
实现加减乘三种运算方式
int Add(int x,int y)
{
return x+y;
}
int Sub()
{
return x-y;
}
int Sub()
{
return x*y;
}
int main()
{
int(*pfarr[3])(int ,int)={Add,Sub,Mul};//函数指针数组的写法
int i=0;
for(i=0;i<3;i++)
{
int ret=(*pfarr[i])(8,4);//这里就是函数的调用
printf("%d\n",ret);
}
return 0;
}
四。指针应用–计算器的实现
(1)写法一:一般的实现(会感觉有点冗杂)
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 Ret(int a, int b)
{
return x/y;
}
int main()
{
int x=0;
int y=0;
int input=0;
int ret=0;
do
{
printf("***********************");
printf(" 1:Add 2:Sub ");
printf(" 3:Mul 4:Div ");
printf(" 0:exit ");
printf("***********************");
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);
int ret=Mul(x,y);
printf("ret=%d\n",ret);
break;
case 4:
printf("请输入操作数");
scanf("%d %d",&x, &y);
int ret=Div(x,y);
printf("ret=%d\n",ret);
break;
case 0:
printf("退出程序");
break;
default:
printf("选择错误,请重新选择");
break;
}
}while(input);
return 0;
}
写完就会发现有一个问题,代码太长且冗余,case的内容几乎一样,所有这时我们可以用函数指针数组的知识进行代码的优化
(2)写法二:使用函数指针数组
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 Ret(int a, int b)
{
return x/y;
}
int main()
{
int x=0;
int y=0;
int input=0;
int ret=0;
do
{
printf("***********************");
printf(" 1:Add 2:Sub ");
printf(" 3:Mul 4:Div ");
printf(" 0:exit ");
printf("***********************");
printf("请选择");
scanf("%d",&input);
if(input<=4 && input>=1)
{
printf("请输入操作数");
scanf("%d %d",&x, &y);
ret=(*p[input])(x,y);//利用数组直接找到了需要的函数程序
printf("ret=%d\n",ret);
}
else if(input==0)
{
printf("退出程序");
}
else
{
printf("输入错误,请重新输入");
}
}while(input);
return 0;
}
这就是利用函数指针数组的方式进行写的代码,避免了switch语句冗长重复的问题