为什么说指针是c语言的灵魂?

指针,是一个让c语言初学者颤抖的坎。

为什么说指针是c语言的灵魂?

因为它提供了内存的直接控制能力,这是C语言和其它高级编程语言的关键特点之一。

基于这个特点,能衍生出非常多灵活的应用,比如内存管理、数组操作、函数参数传递、数据结构、硬件寄存器配置等等。

这样说,可能有点抽象,不要紧,我刚开始接触指针,也是这感觉。

你可以简单理解成,就像人没有灵魂,废了,c语言没有指针,也废了。

因为很多功能,没有指针实现不了

下面举几个例子:

1.硬件寄存器访问

单片机的外设功能是通过配置寄存器实现的,这些寄存器通常位于特定的内存地址,我们通常使用指针来访问这些寄存器。

2.函数参数的传递

void copyString(char *dest, char *src) {
    while ((*dest++ = *src++));
}

比如这个字符串拷贝函数,如果没有指针,字符串操作将变得非常复杂。

比如我们无际单片机特训营的项目3和项目6,项目搭载了我们自己写的一个轮询架构。

这个架构主要有个功能:任务管理调度和队列。

需要用到回调函数和参数不同文件传递,这些功能必须要用到指针。

我在2018年的时候,还特意录了一套视频,手把手用指针去实现队列,有礼貌的可以找我安排,无套路。

类似的高阶应用还有很多。

比如我们菜单实现链表这种数据结构,需要用到结构体指针。

我对指针的理解,经历了几个阶段。

刚接触时,感觉很陌生很复杂,特别是双重指针,不能完全理解,只是死记硬背了它们的定义方式。

刚做开发的前两三年,我总是感觉自己写的程序,不够专业高大上,很多程序都过度使用指针,看起来更复杂显得专业点,现在回看那程序:真傻杯,脱裤子放屁。

工作6,7年以后,独立做了一些复杂的项目,有物联网网关,有Ble产品,研究过协议栈和模块厂的SDK,也见过很多同事写的代码,对指针又有了新的理解。

第一次做这种项目时,功能太多了,完全Hold不住,可能某几个功能能实现,但把整个项目代码组织整合在一起,就会有各种各样的问题。

我攻克这个难关,花了好几年时间,因为它不像单片机的问题,网上都有答案,也有例程参考,这种问题,是开发经验的问题,网上找不到资料,有也只是零零散散的。

当时,我就像捡垃圾一样,协议栈捡一点,同事那里捡一点,网上又捡一点,然后慢慢消化实践,最后形成系统的知识体系。

其实复杂项目做不稳定,问题的本质,就是缺失程序架构设计和模块化编程能力

每个功能设计成模块化,然后让一个系统(RTOS),或者我们自己写的那个轮询架构,去统一管理指挥各模块功能执行,就形成了整个项目的软件架构。

而要实现可扩展性,可移植性强的程序架构,指针绝对是绕不开的坎。

所以,我认为,指针是普通工程师和高级工程师的一道鸿沟,搞不定指针,你就无法进阶到高级工程师。

搞定指针,不仅仅是会定义,会使用。

而是对指针的理解深度,能灵活使用它去做一些高阶应用,解决实际产品开发的痛点。

有时,我和无际单片机项目特训营的铁子开玩笑说,如果我当时能碰到这些项目就太爽了,少走好几年弯路。

因为项目3和项目6整体的程序架构,以及每个功能的模块化设计,用指针去实现这些设计的高阶技巧,都是我们自己摸索了很久,才总结出来的经验。

跟着我们教程,参考我们思维和代码,把项目功能从头到尾完整做一遍,对程序架构以及模块化编程的理解,就比较系统了。

如果你是做单片机开发,可能工作了10年,也理解不了指针的精髓,本质上,和工作年限无关,和你接触的项目体量有关。

如果独立做过复杂的项目,绕不开程序架构的需求,也就绕不开指针的应用。

碰到这种瓶颈时,如果有参考,有人带,就会提升地很快,反之,需要耗费很多时间摸索。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot+shiro+jwt 兼容session和token

最近和别的软件集成项目,需要提供给别人接口来进行数据传输,发现给他token后并不能访问我的接口,拿postman试了下还真是不行。检查代码发现项目的shiro配置是通过session会话来校验信息的 ,我之前一直是前后端自己写,用…

flex布局,子项在主轴上超出父容器的问题

flex布局,子项在主轴上超出父容器的问题 flex布局,子项在主轴上超出父容器的问题 大家有没有遇到,即使子项设置了flex:1 ,以为会分配主轴上的剩余空间。但是效果是子项在主轴上还是超出了父容器。 要解决这个问题,我们可以将f…

《一头扎进》系列之Python+Selenium框架设计篇22- 价值好几K的框架,狼来了,狼来了....,狼没来,框架真的来了

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1. 简介 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了。从本文开始宏哥将会一步一步介…

项目经理如何做好需求管理规程?

软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书,技术解…

使用Arrays.asList 报错Nullpointerexception 需要提前对参数进行判空

//为什么这样的时候会报空指针异常**Arrays.asList 这里这个方法中的参数为空**String[] checkedResourceNos1 dto.getCheckedResourceNos();List<String> checkedResourceNos null; //需要在这里**判断是否为空**&#xff0c;**不为空才能**调**用Arrays.asList转化为…

前端JS必用工具【js-tool-big-box】学习,下载大文件(纯下载功能版)

这一小节呢&#xff0c;我们说一下 js-tool-big-box 工具库&#xff0c;下载文件的用法。这一小节说的是纯下载版本。 意思就是我们在前端项目开发中&#xff0c;下载功能嘛&#xff0c;无论你发送fetch请求&#xff0c;还是axios请求&#xff0c;你总得发送一下请求&#xff0…

Stable Audio Tools - 会打字就能搞音乐创作,AI音频生成工具,一键生成任意背景音乐 本地一键整合包

Stable Audio Tools是Stability AI 推出的AI生成音乐平台&#xff0c;你只需要输入描述性文本提示以及所需的音频长度&#xff08;最长支持512秒即8分钟&#xff09;即可生成高质量的音乐和音效。 你可以通过文本提示就能直接生成摇滚、爵士、电子、嘻哈、重金属、民谣、流行、…

垂直业务系统权限设计

遵循 RBAC 的原则&#xff0c;以更贴近日常工作的业务处理流程&#xff0c;设计一套与总公司分公司相吻合的组织、部门、岗位结构&#xff0c;配套可以继承的权限组和特定的岗位权限&#xff0c;实现系统授权的操作简化和权限的集成应用简化。 RBAC&#xff08;Role-Based Acce…

如何从微软官方下载Edge浏览器的完整离线安装包

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 正文内容 📒🚀 官方直链下载🚬 手动选择下载🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在网上搜索Microsoft Edge浏览器的离线安装包时,很多用户都会发现大部分都是在线安装包,无法满足他们在无网络环境下进…

Mocha Pro 2024 v11.0.1 Mac版摄像机反求跟踪插件更新:优化AE/PR/OFX/达芬奇工作流程

更新Mac苹果版&#xff0c;原生支持Intel和Apple M芯片&#xff0c;安装很简单。Mocha Pro 是一款世界知名的软件和插件&#xff0c;用于平面运动跟踪、3D 跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪。得益于集成SynthEyes核心3D跟踪算法的强大功能&#xff0…

白酒:茅台镇白酒的酒杯选择与品鉴技巧

品鉴一杯品质的白酒&#xff0c;需要选择合适的酒杯和掌握一定的品鉴技巧。在茅台镇&#xff0c;云仓酒庄豪迈白酒备受推广&#xff0c;其酒杯选择与品鉴技巧也备受关注。 首先&#xff0c;选择合适的酒杯非常重要。一般来说&#xff0c;品鉴白酒的酒杯应该具有一定的透明度&am…

使用随机数字或计数器在运行时计算百分比

如果我们需要在运行时计算某些项目的百分比&#xff0c;可以使用 Python 中的随机数生成器或者计数器来模拟这个过程。这取决于我们想要模拟的具体情况和场景。今天我将通过文字方式详细记录我实操过程。 1、问题背景 在处理大量交易时&#xff0c;我们需要对一定比例的交易进…

扩散模型ddpm原理

扩散模型ddpm原理 bilibili 视频讲解 笔记记录 总结&#xff1a;模型反向还原过程中&#xff0c;除模型推理得到噪声预测&#xff0c;还需要从标准正太分布中采样一份噪声&#xff0c;两者的线性组合得到前一时刻的降噪结果&#xff0c;这里可能会有较大的不确定性(对于生成式任…

硬核:浏览器发展的四大方向,早把C/S挤到犄角旮旯了。

浏览器是互联网的基础设施&#xff0c;浏览器早不满足于作为上网入口&#xff0c;而是全面进化啦&#xff0c;比如各类应用开始web化&#xff0c;同时浏览器也被分装到桌面应用中去&#xff0c;本文就给大家分享一下浏览器发展的四大方向。 方向一&#xff1a; 传统桌面浏览器…

shell文本三剑客之sed

一、sed编辑器 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要么存储在一个命令文本文件中。 1、sed的执行过程 读取&…

把Vue文件转至树莓派上遇到的问题和解决方案

把整个文件夹复制进树莓派后&#xff0c;运行 npm run dev ,报错sh: 1: vite: Permission denied 解决方案&#xff1a;删除项目里的 node_modules 重新 npm install 再运行即可 rm -rf node_modules/ npm install 在安装过程中&#xff0c;遇到下图问题&#xff0c;vulnerabi…

Docker:认识Docker Compose

文章目录 什么是docker compose&#xff1f;为什么要使用docker compose&#xff1f;docker compose的功能使用步骤核心功能 docker compose使用场景Docker Compose命令清单Docker Compose 命令格式操作演示创建一个Compose目录创建一个docker-compose.yml文件创建首页目录&…

【笔记】【Git】多个dev分支合并到master分支的文件冲突

问题描述 多个dev分支在同步开发,同时发起代码评审,但合入master的时候存在先后顺序,那么后面同文件的操作则会提示“合并有文件冲突”,导致代码无法入库,只能重新提交。 在个人分支中如何解决与master分支差异,从何顺利提交评审合入代码? 参考方案 1、按照下面的流程…

人工智能的社会应用:深刻变革的新浪潮

人工智能的社会应用&#xff08;语言文本方面&#xff09; 人工智能在社会应用中的广泛运用体现在多个领域&#xff0c;特别是在语音和文本处理方面。以下是这些技术的一些扩展&#xff1a; 1. 文本翻译&#xff1a; 谷歌翻译&#xff1a;利用深度学习模型&#xff0c;支持100多…

「51媒体」媒体邀约-全国邀请媒体现场报道宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 「51媒体」媒体邀约是一家专注于提供媒体传播方案和执行的服务公司&#xff0c;旨在通过一站式服务帮助企业或个人进行有效的媒体邀约和活动宣传。 「51媒体」提供的不仅仅是简单的媒体邀…