拿捏c语言指针(下)
前言
此篇讲解的主要是函数与指针的那些事~
书接上回 拿捏c语言指针(上)和 拿捏c语言指针(中)
没有看的小伙伴要抓紧喽~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
函数指针变量
函数指针变量 用于存放函数的地址
其中,函数名==函数地址,&Add可以换成Add
*pf==&Add ,也就是说Add、*pf、pf三者都可以调用函数

两段有趣的代码
(*(void(*)())0)()
拆分(*( void(*)() )0)()
void(*)() 是函数指针类型,此函数没有参数,返回值是void
( void(*)() )0 是将0这个整数值强制类型转换为一个函数的地址。
*( void(*)() )0 是解引用,
(*( void(*)() )0)() 是调用地址为0处的函数
void(* signal ( int,void(*)(int) ) )(int);
拆分void(* signal ( int,void(*)(int) ) )(int);
signal是一个函数,其参数有2个,int类型和函数指针类型void(*)(int) ,该指针指向的函数参数是int,返回值是void。
signal函数的返回类型是void(* )(int)函数指针 类型,该指针指向的函数参数是int,返回值是void。
typedef类型重命名
- 可以将复杂的类型名字重命名
如:typedef unsigned int uint;
- 对于指针类型重命名
如:typedef int* ptr_t;
- 对于数组指针和函数指针类型重命名 与以上有区别,新的名字要放在里面
如:typedef int(*parr_t)[5]; parr_t是数组指针类型新的名字
如:typedef void(*pf)(int); pf是函数指针类型新的名字所以我们可以将void(* signal ( int,void(*)(int) ) )(int);
简化为以下两句代码
typedef void(*ptr_t)(int) ; 重命名void(*)(int) 为ptr_t
ptr_t signal(int,ptr_t); signal函数的参数类型是int和ptr_t,返回值类型是ptr_t
函数指针数组
函数指针数组本质上是一个数组,里面存放的是函数指针变量
如下代码中
int(*pfArr[4])(int, int) = { Add,Sub,Mul,Div };//pfArr就是一个函数指针数组,可以存放4个元素
//加法函数
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 main()
{int(*pf)(int, int) = &Add;//pf是函数指针int(*pfArr[4])(int, int) = { Add,Sub,Mul,Div };//pfArr是函数指针数组return 0;
}
函数指针数组应用--实现一个简易计算器
实现一个简易计算器,有 加减乘除 功能。
代码实现
利用函数指针数组存放计算函数地址,方便调用。
如下代码中,int(*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };数组下标0处设为NULL,方便其他计算函数对应菜单标号
#include<stdio.h>
//计算器菜单
void menu()
{printf("*****************************\n");printf("*** 1.Add 2.Sub ***\n");printf("*** 3.Mul 4.Div ***\n");printf("*** 0.exit ***\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 main()
{int input = 0;int x = 0;int y = 0;int(*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };//pfArr是函数指针数组// 0 1 2 3 4do{menu();printf("请选择:>");scanf("%d", &input);if (input == 0){printf("退出计算器\n");}else if (input >= 1 && input <= 4){printf("请输入两个操作数:>");scanf("%d%d", &x, &y);int ret = pfArr[input](x,y);printf("结果是:%d\n", ret);}else{printf("选择错误,请重新选择\n");}} while (input);return 0;
}
结果展示
回调函数
回调函数就是⼀个通过函数指针调⽤的函数。
把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。
其中qsort函数的运用是 回调函数 典例
可以参考 手撕qsort函数~ 本篇就不再赘述了
相关文章:
拿捏c语言指针(下)
前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针(上)和 拿捏c语言指针(中) 没有看的小伙伴要抓紧喽~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误&#x…...
Spring源码笔记之SpringIOC--(3)什么是BeanFactory?
什么是BeanFactory? BeanFactory是SpringIOC的最顶层接口,涵盖了IOC容器最基本的操作。ListableBeanFactory、ConfigurableBeanFactory提供了IOC容器获取所有Bean、配置Bean的额外能力。所有BeanFactory的实现类持有所有Bean的定义BeanDefinition&#…...
微信小程序之会议OA个人中心后台交互
目录 获取用户昵称头像和昵称 小程序登录 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties WxConfig WxAuthController 登录-小…...
代码随想录算法训练营第52天(动态规划09 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
动态规划part09 198.打家劫舍解题思路 213.打家劫舍II解题思路 337.打家劫舍III解题思路 今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。 198.打家劫舍 题目链接: 198.打家劫舍 视频讲解: 198.打家劫舍 文章讲解&…...
微服务篇之负载均衡
一、Ribbon负载均衡流程 二、Ribbon负载均衡策略 1. RoundRobinRule:简单轮询服务列表来选择服务器。 2. WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。 3. RandomRule:随机选择一个可用的服…...
wayland(xdg_wm_base) + egl + opengles 使用FBO渲染到纹理实例(六)
文章目录 前言一、FBO介绍1. FBO 简介2. FBO的关键组成部分3. FBO的基本工作流程4. FBO 实现渲染到纹理5. FBO 实现离屏渲染二、FBO 实现渲染到纹理的代码实例1. egl_wayland_texture3_2.c2. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c3. 编译4. 运行总结参考资料前…...
基于 RisingWave、Instaclustr 和 Apache Superset 对维基百科实时监控
得益于 RisingWave 和 Kafka 等流处理工具, 数据工程师能实时洞察流数据中的重要信息。这能够助力制定决策,并在多个层面改善用户体验,包括推荐系统、金融、物流、汽车、制造业、 IIOT 设备和零售。 在这篇博客中,我们会把 Risin…...
建站用帝国CMS好还是WordPress好
随着互联网的迅猛发展,内容管理系统(CMS)在网站建设中扮演着越来越重要的角色。在众多CMS中,帝国CMS和WordPress因其强大的功能和广泛的用户基础而备受关注。本文将对这两种CMS进行详细比较,分析它们的优势与不足,以便用户能够根据…...
深度学习基础之《TensorFlow框架(2)—图》
一、什么是图结构 1、图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据 图结构:数据(Tensor) 操作(Operation) 二、图相关操作 1、默认图 通常TensorFlow会默认帮我们创建一张图 查看默认图的两种方法: &#x…...
Web3区块链游戏:创造虚拟世界的全新体验
随着区块链技术的不断发展,Web3区块链游戏正逐渐崭露头角,为玩家带来了全新的虚拟世界体验。传统游戏中的中心化结构和封闭经济体系已经被打破,取而代之的是去中心化的游戏环境和真实所有权的数字资产。本文将深入探讨Web3区块链游戏的特点、…...
单机启动/开机启动SpringBoot服务的正确方式
此操作只针对于测试环境或单机部署的情况下,使用Jenkins自动化部署或docker部署SpringBoot服务请忽略。 SpringBoot单机启动和集群启动的区别: 部署方式:单机启动可以直接运行jar文件或使用IDE启动应用程序,而双机集群启动需要将…...
[C#]winform基于opencvsharp结合CSRNet算法实现低光图像增强黑暗图片变亮变清晰
【算法介绍】 "Conditional Sequential Modulation for Efficient Global Image Retouching" 是一种图像修饰方法,主要用于对图像进行全局的高效调整。该方法基于深度学习技术,通过引入条件向量来实现对图像特征的调制,以达到改善…...
抓包分析 TCP 协议
TCP 协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类,可以如下几类: 网络嗅探工具:tcpdump,wireshark 代理工具:fiddler,charles&…...
代码随想录算法训练营day27 | 93.复原IP地址、78.子集、90.子集II
93.复原IP地址 和C不同,使用列表存储已经分割的数据,而不是直接操作字符串。为了使用这个列表搞了老久,主要问题出在,在判断终止条件的时候,path也需要回溯一下 class Solution:def __init__(self):self.result []s…...
RuntimeError: CUDA out of memory.【多种场景下的解决方案】
RuntimeError: CUDA out of memory.【多种场景下的解决方案】 🌈 个人主页:高斯小哥 🔥 高质量专栏:【Matplotlib之旅:零基础精通数据可视化】 🏆🏆关注博主,随时获取更多关于深度学…...
LeetCode刷题| Leetcode 45. 跳跃游戏,1190. 反转每对括号间的子串,781. 森林中的兔子,739. 每日温度
45. 跳跃游戏 题目链接: 45. 跳跃游戏 II - 力扣(LeetCode) 思路:这道题思路不难记,遍历数组每个位置,更新下一次的范围,当当前位置已经在当前范围之外时,步数一定得加一ÿ…...
Redis(03)——发布订阅
基础命令 基于频道 publish channel message:将信号发送到指定的频道pubsub subcommand [argument [argyment]]:查看订阅或发布系统状态subscribe channel [channel]:订阅一个或多个频道的信息unsubscribe [channel [channel]]:退…...
⭐北邮复试刷题LCR 034. 验证外星语词典__哈希思想 (力扣119经典题变种挑战)
LCR 034. 验证外星语词典 某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。 给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外…...
ECMAScript 6+ 新特性 ( 二 )
2.12. class类 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。 ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能ES5 都可以做到&…...
JS游戏项目合集【附源码】
文章目录 一:迷宫小游戏二:俄罗斯方块三:压扁小鸟 一:迷宫小游戏 【迷宫游戏】是一款基于HTML5技术开发的游戏,玩法简单。玩家需要在一个迷宫中找到出口并成功逃脱,本项目还有自动寻路(Track&a…...
Label Studio ML Backend架构设计与高可用机器学习服务实现深度解析
Label Studio ML Backend架构设计与高可用机器学习服务实现深度解析 【免费下载链接】label-studio-ml-backend Configs and boilerplates for Label Studios Machine Learning backend 项目地址: https://gitcode.com/gh_mirrors/la/label-studio-ml-backend Label Stu…...
如何通过ReadCat实现纯净小说阅读:开源无广告解决方案
如何通过ReadCat实现纯净小说阅读:开源无广告解决方案 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 在信息过载的数字时代,每打开一个阅读应用都要面对弹窗…...
AI辅助开发:让快马AI帮你构思vc16188视频目标识别代码框架
最近在做一个视频分析的小项目,需要实现目标识别功能。作为一个独立开发者,面对复杂的计算机视觉算法确实有点头疼。好在发现了InsCode(快马)平台的AI辅助开发功能,帮我快速搭建起了vc16188视频目标识别的代码框架。这里分享一下我的实现过程…...
MAF快速入门(21)RC5引入的Script运行能力
大家好,我是Edison。最近我一直在跟着圣杰的《.NETAI智能体开发进阶》课程学习MAF开发多智能体工作流,我强烈推荐你也上车跟我一起出发!上一篇,我们了解下.NET 10新推出的File-Based App模式,它和MAF一起可以形成一个强…...
OpenClaw隐私方案:Kimi-VL-A3B-Thinking本地处理医疗影像数据分析
OpenClaw隐私方案:Kimi-VL-A3B-Thinking本地处理医疗影像数据分析 1. 为什么医疗数据必须留在本地? 去年参与一个医学研究项目时,团队需要分析3000多份CT影像。当我们尝试使用某云服务时,合规部门直接叫停——这些包含患者面部特…...
旧设备升级指南:用OpenCore Legacy Patcher让Mac重获新生的5个实用步骤
旧设备升级指南:用OpenCore Legacy Patcher让Mac重获新生的5个实用步骤 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果系统的不断更新&a…...
SEO_深入解读搜索引擎算法与SEO核心原理
SEO:深入解读搜索引擎算法与SEO核心原理 在互联网时代,如何让你的网站在搜索引擎上排名靠前,成为了每一个网站运营者的心头之患。搜索引擎优化(SEO)作为提升网站可见性的重要手段,背后的核心原理和搜索引擎算法的不断…...
5步搭建你的私人云游戏服务器:Sunshine开源串流方案详解
5步搭建你的私人云游戏服务器:Sunshine开源串流方案详解 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源的游戏串流服务器软件,专为Moon…...
Live Avatar数字人生成避坑指南:硬件要求与常见问题解决
Live Avatar数字人生成避坑指南:硬件要求与常见问题解决 Live Avatar是阿里联合高校开源的一款端到端数字人生成系统,它能把一张人物照片、一段语音和几句文字描述,变成自然流畅的说话视频。听起来很酷,对吧?但现实往…...
3步打造手游键鼠操控系统:QtScrcpy突破触屏局限的高效解决方案
3步打造手游键鼠操控系统:QtScrcpy突破触屏局限的高效解决方案 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 在移动游戏日益复杂的今天,触屏操作的物理限制…...


