本节代码高能全程高能呦。适当摸摸鱼,调整自身状态。不要忘记锻炼呀,有钱也得有命花才行呀~给家人打个电话,唠唠家常。

文章目录

  • 前言
  • 1. 函数指针
    • 1.1 函数指针格式
    • 1.2 函数指针调用
    • 1.3 实例解读
  • 2.函数指针数组
  • 3. 计算器实现

前言

本节主要用到函数指针相关知识,感受函数指针的高效高能。首先是实现计算器,第二是实现比较任意类型数据的冒泡排序。


1. 函数指针

函数也有地址,指向函数的指针就是函数指针。

1.1 函数指针格式

函数的地址用函数名或者&函数名表示。函数指针的格式是 函数返回值类型 (*指针名) (参数名)

int test(int  int);
int (*pt)(int, int) = &test;  //pt是指向test函数指针
int(*pta)(int, int) = test   //函数名也能直接表示函数地址

1.2 函数指针调用

以上面实例为例,调用格式为

(*pt)(2,3);
或者
(pta)(2,3)

对pt指针解引用,找到函数,调用函数传参。因为指针pta可以直接替换函数test,所以不加‘ * ’也可以。两种方式都合法。

1.3 实例解读

  1. 观察如下代码,这个代码是在做什么呢?花时间,分解一下呦,提示:从0突破
(* (void (*) () )0) ();

答案:此代码为通过函数指针调用首地址为0的函数。

解析:从0开始,0前面是一个括号(void (*) ()),是一个函数指针,在0前面,意为强制类型转换,将0强制转为函数指针类型。再往前,有一个‘ * ’,对0函数指针解引用,最后面的括号是在传参。
2. 观察如下代码,说出代码作用。提示:signal是函数名还是指针名呢?

void (* signal(int, void(*)(int))) (int);
答案:
这是一个函数声明,函数是返回值为void(*)(int)类型,
函数名是signal,参数列表是(int, void(*)(int))
解析:
看signal,并没有和‘ * ’括在一起,由于优先级,
signal先与后面的括号结合,故signal是一个函数。
后面紧跟的(int, void(*)(int))是函数signal的参数列表。
将signal(int, void(*)(int))抠出来,会发现还剩下void(*)(int)
这是一个函数指针,这里作为signal函数的返回值类型,大家要注意这种特殊的写法呀

代码优化
上面的写法很难分析,我们可以使用typedef对类型重命名
例如,将unsigned int 换成unit

typedef  unsigned int  unit;

应用:将上面的void(*)(int)换成pf_t

typedef void(*pf_t)(int)
void (* signal(int, void(*)(int))) (int);
被替换为
pf_t  signal (int, pf_t);

2.函数指针数组

函数指针数组是一个数组,数组的每一个元素是函数地址。通过函数地址调用函数。通过下面实例说明。

3. 计算器实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{printf("****************************\n");printf("****************************\n");printf("***** 1.Add     2.Sub ******\n");printf("***** 3.Mul     4.Div ******\n");printf("***** 5.Sur     0.Exit *****\n");printf("****************************\n");printf("****************************\n");
}
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 Div(int x, int y)
{return x / y;
}
int Sur(int x, int y)
{return x % y;
}
int main()
{   int input;int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };do{menu();printf("请选择操作:>");scanf("%d", &input);if (input == 0)printf("退出");else if (input >= 1 && input <= 5){int x = 0;int y = 0;printf("请输入两个操作数:>");scanf("%d %d", &x, &y);int ret = parr[input](x, y);printf("结果为%d\n", ret);}elseprintf("输入错误");} while (input);
}

解析:

int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
parr为函数指针数组,,包含6个元素,每一个元素是函数地址。
书写就是在函数指针 int(*) (int,int)的基础上加上数组类型parr[6]
调用函数方法: parr[input](x, y);

【C语言】计算器实现相关推荐

  1. html语言简单,简单的html语言计算器

    <简单的html语言计算器>由会员分享,可在线阅读,更多相关<简单的html语言计算器(3页珍藏版)>请在人人文库网上搜索. 1.简单的计算器源码如图:代码input.MyBu ...

  2. c语言计算器取百分数,c语言计算器程序设计包含加减乘除简单的函数运算

    c语言计算器程序设计包含加减乘除简单的函数运算 c语言计算器程序设计包含加减乘除简单的函数运算 人气:258 ℃时间:2020-03-28 13:19:41 优质解答 实用计算器之程序设计 [摘 要] ...

  3. c语言计算器程序代码 链栈,【C语言】简易科学计算器源代码(链栈应用)(原创).doc...

    [C语言]简易科学计算器源代码(链栈应用)(原创) 用到的是算符优先法的思想,现摘自严蔚敏的数据结构(C语言版)的3.2.5章来详细说明算符优先法的思想: (摘抄结束) 我给出的计算器功能有:支持欧拉 ...

  4. 小数阶乘怎么用c语言计算器,自编科学计算器 支持多次方 多次开放 阶乘 部分数学函数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /**************************************************************************** ...

  5. c语言计算器开题报告,基于单片机的简易电子计算器设计开题报告.doc

    第 PAGE 3页 授人以渔能力为本 毕业设计开题报告 学生姓名 学生学号 毕业设计题目 基于单片机的简易电子计算器设计 1.选题背景(含国内外相关研究综述及评价)与意义 随着社会的发展,科学的进步, ...

  6. c语言计算器实训任务案例,C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入 ...

  7. java语言计算器怎么写_求助,一个计算器的括号功能怎么写啊。

    求助,一个计算器的括号功能怎么写啊. import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java. ...

  8. c 语言计算器带括号优先级,C++结合QT实现带有优先级的计算器功能

    代码 MyCalculator.h #pragma once #include #include #include #include "ui_MyCalculator.h" cla ...

  9. 补码加减c语言,C语言计算器含二进制数加减原反补码(自己的期末作业)

    用C++6.0编写的计算器,内含整数小数加减乘除.二进制数组加减及求原码补码反码! #include #include int main() { void top(); void no1(),no2( ...

  10. c语言计算器n次方根,如何使计算器上一次的运算结果作为下一次运算的操作数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include void menu() { printf("***欢迎使用简单计算器***\n"); printf ...

最新文章

  1. 国内 Java 开发者必备的两个装备,你配置上了么?
  2. 西安python培训班多少钱-西安Python培训班哪个好
  3. ls命令显示结果图解
  4. CTFshow php特性 web111
  5. 《深入理解Java虚拟机》笔记3——7种垃圾收集器
  6. PMcff 020产品经理峰会现场火爆,干货不断
  7. Living life over 假如生活重头再来
  8. 《MySQL——加锁规则(待补全,有些没看懂)》
  9. php e error,E_ERROR定义与用法汇总
  10. 学习阶段怎么模拟_掌握学习方法,早日取得执业药师证
  11. 【VUE】限制输入特殊字符
  12. 時間用function 來計算...如此精確.
  13. java之重定向与转发
  14. DOS批处理高级教程:第二章 DOS循环for命令详解(转)
  15. 矢量地图自定义切片样式
  16. Abaqus RVE单元 周期性边界施加(PBC) 前处理(一) 单元重新编号及Equation方程建立
  17. Windows电脑蓝牙打电话-预研总结
  18. unity的ui跟随鼠标移动
  19. 什么是华为云服务器?它有什么优点?
  20. Linux 学习笔记 三

热门文章

  1. WINDOWS系统最近使用的项目路径
  2. python清理浏览器文件_URL可以在浏览器或wget中正常工作,但是从Python或cURL中清空...
  3. java检索账号和密码_如何从数据库中检索密码
  4. C语言--------学生管理系统(源代码)
  5. C语言初学者学习资料分享
  6. 完整的连接器设计手册_连接器卧式插拔力的测试介绍
  7. 软件园区网络设计之网络详细设计
  8. thinkphp——登录界面
  9. java案例教程_JAVA基础案例教程 PDF 下载
  10. hbase java 教程_Hbase 教程-安装