函数指针——C语言

int f(float, float);

提问1:这个 f 是个什么东西?

解析:在C语言中,这是声明了一个形参数据类型为(float, float),返回值类型为int的 f 函数。

int *f(int, int);

提问2:这个 f 又是什么东西?

解析:在C语言中,这是声明了一个形参数据类型为(int, int),返回值类型为int型指针的 f 函数。

int (*f)(int, int);

提问3:这个 f 又是何方神圣?

解析:别急,先从第一个括号开始分析,可以得出 f 是个指针,又从第二个括号看出有函数调用,且返回值为int类型,在C语言中,这个 f 为一个指向形参为(int, int),返回值类型为int 的函数的指针,对,f 是一个指针,一个指向函数的指针。(函数也要存放在某个指定位置,也有地址)

int (*f[])(int, int);

提问4:这个 f 又是神马玩意?

解析:经过前面的分析,可以得出,在C语言中,这个 f 是一个数组,它的元素为形参(int, int),返回值类型为int的函数指针,是的,这个 f 数组里存了一堆函数指针。

2.在理解了函数指针的概念后,让我来运用实现一个简单的计算器,来看看有哪些妙用

1.先写一个简易计算器的接口(funcp.h)

/*
** 定义一个简单计算器的接口
*/
#include <stdio.h>
#include <string.h>

/*
** 计算两数之和
*/
double add(double *a, double *b);

/*
** 计算两数之差
*/
double sub(double *a, double *b);

/*
** 计算两数之积
*/
double mul(double *a, double *b);

/*
** 计算两数之商
*/
double div(double *a, double *b);

/*
** 返回字符在字符数组中的索引,有3个参数
** 参数1:oparr寻找的数组,
** 参数2:op为要找的字符
** 参数3:cmp为函数指针,指向某一函数,该函数为回调函数,
** 用来比较字符是否相等,我用的是strncmp函数
*/
int serchIndex(const char *oparr, const char *op, 
int (*cmp)(const char *str1, const char *str2, size_t count));

2.再写一个具体函数实现的文件(funcp.c)

#include "funcp.h"

double add(double *a, double *b){
    return (*a) + (*b);
}

double sub(double *a, double *b){
    return (*a) - (*b);
}

double mul(double *a, double *b){
    return (*a) * (*b);
}

double div(double *a, double *b){
    return (*a) / (*b);
}

int serchIndex(const char *oparr, const char *op, 
int (*cmp)(const char *str1, const char *str2, size_t count)){
    int i = 0;
    while((oparr + i) != NULL){
        if(cmp(oparr + i, op, 1) == 0)
            return i;
        ++i;
    }
    return 0;
}

3.最后写main.c文件实现简易计算器

#include "funcp.c"

int main(){
    //定义第一操作数,操作符和第二操作数
    double a, b;
    char op;
    //定义索引
    int index;
    //定义一个函数指针数组
    double (*opfunc[])(double*, double*) = {add, sub, mul, div};
    char oparr[] = "+-*/";
    printf("请输入第一个数: ");
    scanf("%lf", &a);
    printf("请输入操作符(+-*/): ");
    scanf("%s", &op);
    printf("请输入第二个数: ");
    scanf("%lf", &b);  

    //strncmp作为回调函数,回调函数会将返回值返回调用函数中,
    //这是函数指针的妙用体现,在这里是实现比较两个字符串是否相等
    //在编译时,C编译器会将函数名转换为一个函数指针
    index = serchIndex(oparr, &op, strncmp); 

    //输出答案
    //通过索引找到对应计算函数,这也是函数指针的妙用之一
    //如果不用函数指针,可以通过switch分支选择对应函数
    printf("\n结果: %.2lf", opfunc[index](&a, &b));
}

 测试简例(控制台输出):

请输入第一个数: 3
请输入操作符(+-*/): *
请输入第二个数: 5

结果: 15.00

总结:函数指针可以在函数形参中作为回调函数应用,也可替代switch分支起转换表的作用,合理运用函数指针,可以极大提高代码效率,C语言yyds!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

New_Teen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值