指针应用--计算器的实现

指针应用–计算器的实现

一。简介:

在准备写计算器实现的代码前,我们需要了解一些关于函数指针函数指针数组的知识,还有很多关于指针的知识,如有需要请看之前的博客“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语句冗长重复的问题

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值