栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

函数指针——C语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

函数指针——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 
#include 


double add(double *a, double *b);


double sub(double *a, double *b);


double mul(double *a, double *b);


double div(double *a, double *b);


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!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875625.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号