场景一:回调函数

上一篇文章我们写了回调函数作为冒泡排序的比较规则来实现调用者的多样化要求,其实这就是C语言中函数指针应用广泛的一种场景
链接放在下面啦,敬请垂阅:

冒泡排序(进阶):运用回调函数,模拟实现库函数qsort

场景二:转移表

我们来实现一个简易的计算器:


//来做一个简易的计算器
int add(int x, int y) {return x + y;
}int sub(int x, int y) {return x - y;
}int mul(int x, int y) {return x * y;
}int divide(int x, int y) {return x / y;
}
int main() {int x = 3, y = 4;printf("请选择:1.加法 2.减法 3.乘法 4.除法\n");int choice = 0;scanf("%d", &choice);printf("请输入你要操作的数:\n");scanf("%d %d", &x, &y);//根据用户输入的选择决定调用哪一个函数int ret = 0;if (choice == 1){ret = add(x, y);}else if (choice == 2){ret = sub(x, y);}else if (choice == 3){ret = mul(x, y);}else if (choice == 4){ret = divide(x, y);}else{printf("输入的choice有误!\n");}printf("%d\n", ret);
}

圈复杂度:
我们怎么理解圈复杂度呢?
一段代码的分支越多,就认为这个代码的可读性越差。
圈复杂度是衡量一段代码可读性的指标~
如果这段代码平铺直叙,没有任何的条件/循环,就认为圈复杂度是1
遇到一个条件,圈复杂度就+1,遇到循环也+1,这个值越大,就说明这个函数越复杂,越难管理~
我们来看看上面计算器中的这段代码:

很多公司的编程规范都对圈复杂度有明确约定~~
一般一个函数圈复杂度不应该超过10。
虽然当前代码圈复杂度没有超过10,但是需求在变更,总有一天会超过的.
试想一下,这个简易的计算器仅仅只有四个功能,就这么多条件,如果功能上升到几百几千呢?
那么在C语言中,这个问题是怎么解决的呢?

转移表的使用

//转移表的使用
//函数指针的声明
typedef int(*Func)(int, int);int main()
{int x = 0, y = 0;printf("请选择:1.加法 2.减法 3.乘法 4.除法\n");int choice = 0;scanf("%d", &choice);printf("请输入你要操作的数:\n");scanf("%d %d", &x, &y);//函数指针数组Func arr[] = {                   NULL,        //传入NULL的目的是规范数组的下标     0add,         //                                1sub,         //                                2mul,        //                                3divide       //                                4};int ret = arr[choice](x, y);        //通过这种方法我们获取到函数指针,通过函数指针又获取到函数进行运算   直接降低了代码的圈复杂度printf("%d\n",ret);return 0;
}

使用函数指针用作转移表,大大降低了函数的圈复杂度,使整段代码可读性得到提高,也缩减了代码量。

指针进阶:函数指针的应用场景相关推荐

  1. 【C语言】指针进阶 - 指针数组 数组指针 数组指针传参 函数指针 指向函数指针数组的指针

    目录 一.字符指针 一道题 二. 指针数组 解引用打印数组元素 &数组名 数组名 字符指针初始化 三.数组指针 取数组地址-放在数组指针里 类型 数组指针的使用 二维数组传参 判断 四.数组参 ...

  2. 指针进阶(指针与数组传参、数组指针与指针数组、函数指针数组、回调函数的辨析)

    指针 指针作为C语言中极具代表性的特征之一,也是C语言学习中的一大难点. 简单来说,指针我们需了解的最基础的即: 指针是一个用来存放地址的变量,地址唯一标识一块内存空间. 指针的大小是固定的4/8个字 ...

  3. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  4. 函数指针和函数指针数组及其应用

    1. 函数指针 先来看一个简单的例子: int a=3; void *p=&a; 这是一个基础的不能再基础的例子.相信学过指针的都能看得懂.P是一个指针,指向a.a 是一个整形变量.函数指针和 ...

  5. C语言enum(枚举)、指针、函数指针

    C enum(枚举) 枚举是c语言中的一种数据类型,定义格式为 enum 枚举名{枚举元素1,枚举元素2,......}; 用#define定义一星期七天,就要为每个整数定义一个别名 #define ...

  6. 面试准备每日五题:C++(六)——CC++、staticconstextern、sizeof strlen、指针引用、数组指针指针数组函数指针

    文章目录 一.C和C++的区别是什么? 二.关键字static.const.extern作用 三.sizeof和strlen的区别 四.指针和引用的区别 五 .指针数组.数组指针.函数指针 一.C和C ...

  7. 函数指针 和 函数指针数组 和 函数指针数组

    //先看一些函数指针的例子(吸纳了网上兄弟的方法) #include <stdio.h> void MyFun(int x); //这个申明也可写成:void MyFun( int ); ...

  8. C++基础:指针,函数指针

    /*变量指针,函数指针 http://www.cnblogs.com/yukaizhao/ */ #include <iostream>using namespace std;//做函数声 ...

  9. 函数指针,函数指针数组,函数返回值为函数指针

    函数的名字就是函数的首地址:定义函数指针; int (*p)(int )     p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以 ...

  10. C语言指针(函数指针数组,二级指针)

    int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...

最新文章

  1. C++中指针和void
  2. JavaScript对象、原型、原型链知识总结思维导图
  3. 200801一阶段1函数封装
  4. WZ132发现打CXY要么是程序员,要么是丑小鸭
  5. LeetCode-147:对链表进行插入排序
  6. Servlet的使用你掌握多少?
  7. Vant Weapp小程序蹲坑之事件名称问题及解决方案
  8. FTPSFTP的基本命令
  9. excel锁定前几行,无法选择和编辑
  10. 金融货币学笔记(米什金)第二章 金融体系概览
  11. 校园网连不上,火绒检测dns错误但修复不了,360直接搞定,nice!
  12. base64图片上传解析不了问题
  13. 精选免费论文翻译工具
  14. 2013年5月上海乌镇游
  15. 一维卷积的意义和二维卷积(图像处理)的简单理解
  16. 专家库管理软件专家评审系统_专家系统2 0
  17. Kafka| 下载与安装
  18. 西工大计算机夏令营面试
  19. 实战五十一:基于python机器学习深度学习实现股市评论情感分析 (完整代码+数据集可直接运行)
  20. 双十一选IT培训?都在这,超低价

热门文章

  1. 贪吃蛇java游戏代码_java实现贪吃蛇游戏代码(附完整源码)
  2. 【腾讯开源项目】一个开放式的开发平台,蓝鲸PaaS平台源码对外开放
  3. 16.火焰传感器实验
  4. MySQL专题系统归纳快速上手(常用cmd命令,常用函数汇总,SQL语句精讲带示例)适用初学、用法速查
  5. 电脑版桌面云便签账号怎么绑定微信或解绑微信?
  6. 小程序服务器获取appid,微信小程序小程序appid如何获取
  7. 啥叫全国统一大市场?
  8. August 2007
  9. 安全生产知识竞赛试题库及答案
  10. python查询12306余票_【python】用GUI编写一个12306余票查询的系统,附源码