粉丝3317获赞5635

各位小伙伴,今天我为大家梳理了一份从软件到硬件的书单,这份书单包含了从 c 语言数据结构这样的地基,到 linux 单片机这样的核心,再到 c 加加 qt 这样的应用层开发。我将结合每类书籍的特点,分析它们的优势与短板,希望能帮助大家在茫茫书海中找到最适合自己当前阶段的那一本, 让大家在成为潜入式大牛的道路上少走弯路。 pdf, 电子书都放在了主页群,有需要的同学可以进群取。 哈喽,大家好,我是乐游,本期的话呢,给大家分享一下学习技术开发有哪些书籍是值得我们去借鉴的,那下面的话,我会按照先软件再硬件的一个顺序来推荐一些书籍给到大家。 先从比较基础的 c 语言数据结构和我们的算法,再到了这个 linux c r 加 q t 单面机以及我们的一个 app。 当然呢,咱们也可以把这一个顺序呢,当做是我们学就是学习的一个路线啊,也是 ok 的。 那么首先的话是咱们的这一个 c 语言, 但凡是我们计算机专业或者电子类啊,或者通信类,或者是我们的机械自动化啊这样专业的一些同学的话,我们在大学的时候,基本上 c 语言算是我们的一个必修课,而且大部分的这种高校呢,他选择的教材啊,基本就是这一本 c 语言程序设计啊,为什么是用这本书呢?因为它的话简单基础,适合我们初学者来入门。 除了这本书之外啊, c 和纸质这本书也非常适合我们的初学者,他呢从最基本的这个数据类型开始讲起,包括了我们的一些控制结构啊,预算符,符合预算表达式等等之类的,以及呢比较高深一点的纸质啊,数组函数,对吧?我们的内存管理内容方面是比较全的,对于初学者来讲的话呢,也比较友好。 那我们有了 c 的 基础之后啊,想要去深入一下 c 啊,提高我们 c 的 一个能力的话呢,可以去看一下 c 专家编程这本书。他的话啊,不太适合零基础的同学, 因为他一上来就会讲到职称和数组之间的一个区别啊,我们的动态库,静态库以及呢对于内存管理的一些思考,对吧?说想要提升学员的话,我们就可以去看一下这本书。最后啊,还有一本高质量的 c b 层 这本书呢,其实也有很多院校啊,会把它当做一个教科书去使用,那么这一些的话,是我们在 c 的 这个阶段,大家可以去借阅的一些书局。那么接下来的话呢,就是我们的一个数据结构了,学习这一个数据结构啊,我比较推荐的话是这一个大化数据结构 这本书啊,比较适合咱们初学者书上的这个图啊,他会比较多,能够帮助我们呢去理解其中的一些逻辑跟原理。但内容方面也很全面,包含了现行结构啊,包括像我们的这个顺序表,单列表,双向列表以及循环列表这种现行结构,对吧?以及呢我们的站队列和自创等等, 还有我们的树形结构跟图结构,在整本书里面都会去进行一个讲解的。那么算法的话呢,它包括了一些基本的一个入门书籍来讲的话,是非常合适不过的。 再一个的话呢,就是我们的一个算法导论,这本书的话就更侧重于算法了,适合一定基础的同学,就是有具备过这样一些基础的同学啊,当我们看到这种堆排序,规定排序啊,或者说动态规划贪心算法的时候啊,就知道我们如果说想 把这本书拿下来的话啊,绝对不是一时之时, ok 吧,所以要花一点时间的。当然也会有很多的同学不太理解啊,为什么我们去学习七六四还要学算法,对不对? 一呢是为了鄙视啊,越是大厂他考察这一个数据结构或者算法的话呢,就会比较多。二的话就是操作系统本身,它会涉及到很多复杂的这种数据结构相关的一些内容,也就是我们接下来需要学习的这一个 linux。 那 其实 linux 的 学习的话呢,总共分为两部啊,第一部的话就是基础的一个命令啊指令和我们的这一个 linux 系统编程。那主要的话呢,其实讲操作系统的书到底有哪些可以值得推荐呢?首先就是我们的一个鸟哥的这一个 linux 版本啊,这本书的知名度还算是比较高的, 但是具体的内容的话呢,呃,其实我这边还是没怎么去读过。如果说大家有一点 linux 基础的话啊,就更推荐大家去看一下这个 linux 高性能服务器编程的这本书,上 面的代码会比较多,而且都是一些比较完整的代码,可以直接拿过来进行编运行的。那既然是服务器编程的话呢,它会更侧重于这种病发操作啊,比如说进城或者说进城间通信啊,这样子的一个情况 啊,我们的现成词,对啊, t、 c、 u d p 等等这类相关的一些技术在里面适合呢,我们具备一定编程技术的小伙伴来去进行一个借阅。好吧,那如果说咱们的这一个 linux 应用层学的差不多了啊,掌握的 ok 了的话呢,那么就可以往深入的去看一下我们的一个 linux 内核相关的, 那对于 linux 内核的设计与实现的话呢,这本书我觉得大家可以去花点时间看一下啊,它整个书的内容其实不是特别多,大概的话三百多页啊, 但是呢,它包含了进程管理啊,中断内存管理等等一些相关的机制在里面。最后的话呢,就是我们的 linux 的 一个驱动了啊,我推荐的话是这一个 linux 设备驱动和 linux 设备驱动开发详解啊,这两本书前者的话呢,是国外的一本书啊,后者的话呢,是出自于我们这一个宋宝华老师的,所以大家如果在 linux 下面想去花一些时间提高自己的,可以围绕 老师给大家推荐的这几本书。好吧,那接下来就是我们的一个 c i 加的一个开发了,对不对?很多同学其实不太理解,就是我学金融是有必要去花时间学习这个 c i 加吗?啊,我的回答的话呢,是有必要的,首先呢,在笔试的时候,其实 c 语言经常会和这个 c i 加混在一起啊,而且呢,学习 c i 加也能够更好地去帮助我们理解 c 语言。 再一个啊,做金融是应用开发,有的时候会涉及到 c 语言,这其实是大部分情况下会有的,比如说 q t, 对 吧?那么我们学习 c i 加呢,我推荐一本啊,比较经典的书籍啊,这个 c i 加 primer 对 吧?这本书啊,内容很全面,从 c 语言 这个最基本的数据类型会开始讲起,到面向对象的抽象封装,继承、多态三大核心,都会跟大家去详细的讲解,非常适合我们 刚入门的这种小白选手。那软件部分的话呢,其实最后就是我们的 q t 了啊,比较经典的话是 q t 五的一个开发实力,但是这本书的内容会比较多呀,所以说,呃,它更适合什么呢?更适合去查阅,没有必要去从头看到尾,像 q t 中啊,经常用到的一些内容,它其实也就占到了百分之二十左右,对吧?所以说呢, q t 五的话啊,我们一般用来查阅就 ok 了。 那硬件部分的话,其实主要包括了我们的 siri 和我们的 arm, 对 不对?那学习硬件的话,其实更推荐大家去看视频啊,那书籍的话,帮助没那么大, 买一块黑板啊,一边听课一边写程序,然后下载进去,我们直接看现象,其实是最好的一个方式。那么当然了,我也整理了一些书籍啊,如果说评论区的小伙伴啊,有需要的话,可以直接在评论区进行留言,我把我会私发给大家的。好,那么本期的分享就到这里了,各位,我们下期再见,拜拜!

想学单片机的朋友们一本书啊,就是你不熟悉这个开发流程的话,你可以看这本书,这本书很早就有了,只不过不叫这个名字,叫那个硬件十万个为什么,然后这是他最新版出的一个书吧,然后他改了名字叫硬石, 他这个就很好写的,就是你如果不知道你每一个时间节点该干什么的话,你就可以看一看这个书,就是你首先你肯定得知道做一个产品他需要有哪些步骤啊,要不然你之后不管你是做软件,硬件, 那交流起来都非常麻烦。所以说这个书大家可以看一下,这个书我之前看过他的那个老版本,然后他出了这个新版本了,我就是正好手头没有,然后就搞了一本在身边读一读, 很轻松,读起来大家就详细知道一个开发的流程就行了。这些开发流程比如说你什么时候该设计啊,什么时候把这个产品交给硬件去测试啊,这些写的很详细,推荐给刚入行的朋友们。

最近有不少同学问我想做千数家 q d 上位机,学习路线怎么走?这个我真是大学的时候走了不少弯路,总结出了这个几点学习路线,希望对你有所帮助吧。我们只学能让我们写出作品,写到简历通过面试的东西。 第一个是学习 c 和 c 加加,这个学习周期为四到六周吧,关于 c 加加,你不需要整本书都会,只需要做到这三点就够了。第一点是 会用基本的函数指真结构体, s, t, l, 例如 setmap, vector 这些东西,容器知道它们的优势劣势就行就够了。第二点是会用 git 进行版本管理和 cmake 进进行基本的编译。第三点是会写一个小工具,如文件解译助手或 tcp 客户端, tcp 服务器,这些东西要求是给你需求你能够完整的写出来并且调通。第二步是五千兆式整一个 stm 三二或 linux 的 板子,这一点不需要你什么都懂,只需要你打通就行。会一些最基本的,如串口、 fnc, 定时器, pwm, adc 采上这些,然后可以也采集到传传感器的数据,这一步要求你可以采集传感器的数据,通过串串口稳定地发发送到电脑上。第三步是学习 qt, 我 们只学我们工作中常用的信号和槽 布局空件。通信方面我们要会串口通信和网口通信,然后展示方面要会会做表格和曲线图,这些东西 要求是 u i 不 卡,可以数据一直不断的接收,然后可以进行异常重连。第四步是需要会 linux 的 编程,会用 q d 进行交叉变异,这一点要求会 linux 的 一些基本的命令,然后和一些配。第四步也是最重要的一步,就是 做两到三个项目,把我们学的这些东西整条链路打通。第一个项目可以做一个串口调试助手,然后可以进行串口数据的解析,然后日制的打印,加一些校验。第二个是做一个设备监控软件,可以 监控设备曲线的报警阀值,然后可以进行历史数据的查询。第三个是做一个硬件联动项目,选一个 stm 三二,然后可以采集数据发送给上,发送给商域机,然后商域机可以下发数据控制 stm 三二, 做一个完整的闭环,做到这些就可以把这些项目写进简历里了。二六届的,你现在做到哪一步了?评论区打出来一二三四,我看你当前的进度,告诉你下一步该怎么做。

逼自己一个月学完,你的潜入式 linux 开发水平就很牛了,存下吧,真的很难找全的。本系列课程耗时三个月,制作共计四百三十分钟,全场七小时,带你一口气从零基础入门进阶,掌握潜入式 linux 开发所有重难点知识。 课程内容全是行业刚需,包括内核开发、驱动编程、文件系统交叉变异、多现成编程等高频实用知识点,不讲废话,只讲重点。由于视频较长,分为六期发布, 为了让零基础的小伙伴学习起来没有负担,教程中配套资料以及我整理的全套学习资料,对零基础超有帮助的学习路径。已关加评论幺幺幺即可全部带走,如果你看到了这,还请支持一下主播, 让更多想要学习潜入式 linux 开发的小伙伴看到这个视频。接下来我们开始这套系统课的学习吧! 那我们这个课程呢,主要呢给大家分为了六个部分来讲解。第一个部分呢,我们会给大家简单介绍一下我们另一个操作系统的一些基础知识,包括它的发展啊 啊,结构啊以及特点啊等等啊。然后第二个部分呢,我们会给大家介绍 linux 操作系统它的一个安装,因为我们要使用它,所以说我们首先要在我们的电脑上先把 linux 操作系统先安装上来啊。第三个部分呢,我们会给大家简单介绍一下 linux 操作系统它的文件系统相关的一些基础知识。 第四个部分呢,我们会详细的来讲解一下 linux 操作系统它的一些命令使用。那么我们知道 linux 操作系统呢,大多数时候呢,我们都是通过命令的方式来使用它,尤其是在我们的嵌有式开发的时候啊,做一些底层开发的时候,更多的时候我们用的是命令,很少用图形界面 啊,虽然他也支持图形界面啊。然后第五个部分呢,我们会给大家介绍一下在 linux 操作系统上如何进行应用程序的安装和卸载。 然后第六个部分呢,我们会来介绍一下在另一个操作系统中,一个文本编辑器 v i 它的一个基本使用啊。那首先呢,我们先来看一下另一个操作系统的基础知识,这个部分我们要学习的一些主要内容。 那这个部分呢,我们首先呢要学习要了解我们的这个另另一个操作系统的一个发展啊,了解另一个操作系统的一个发展。 然后第二个呢,我们要理解另一个操作系统它的这个特点啊。然后第三个部分呢,我们要掌握另一个操作系统的一个组成结构,尤其是这个组成结构,它是我们的一个重点,也是难点啊,我们考核也是考核它 啊。那么在这个部分呢,我们会有一些常见的一些小名词啊,这个我们在课程中也会讲到像 colonel sheil, 阿巴什 sheil 这样的一些名词啊。好,那么我们先来进入我们的第一讲, 第一讲呢,我们会来给大家介绍一下 linux 的 发展组成结构和特性啊,那么先来说一下它的发展,发展呢,我们就要从这个 linux 的 一个 人啊,发明这个 linux 的 一个人叫 linux 啊,那么他在大学的时候呢,他学的是 linux 啊,是一个 linux 系统,那并不是太好,也不是很完善。然后呢,这个呃,在九一年的时候呢,由这个 linux 呢, 他自己呢就去写了一个保护模式下的一个操作系统啊,嗯,大概是九一年十月的时候呢,他就把它写好了啊,当时呢这个系统呢,大概有八千行的代码啊,那么是最早的一个版本,我们叫做零点零一版 啊,那他呢是把它放到他们大学的一个 f t v 服务器上,供自由下载,当时知道的人并不多,主要是一些黑客去访问了它,并且对它进行了一些修补啊,然后这个更改啊,完善啊等等。 那后来呢,这个 linux 呢,将它的这个 linux 呢就加入到了 glue 啊, glue 对 这个 linux 的 发展是起了非常大的推动作用,加入这个 glue 以后呢,它就遵循了一个 g p l 的 协议 啊,那现在呢, g p r 已经发展到 g p r 三了啊,它是一种非商业用途啊,遵循 g p r 协议,非商业用途啊,就是说它允许开源,开源免费吗?但这个免费主要是非商非商业用途,如果你是商业用途的话,也不会是免费啊,它允许开源,然后分享、传播和修改,这是因为 它加入了跟路以后, linux 系统遵循这样的一个协议,所以说有更多的一些组织和优秀的一些程序员就来使用这样的一个系统,并且对它进行不断的修改,不断的完善啊,那么涉及到一些内核的修改呢,都会经过这个 linux 这个人的一个审核 啊,那么发展到现在呢,我们说内核的最新版本呢,已经到了四点一点四了,所以你大家可以看到它的发展非常的迅速,非常的快啊,当然基于这个内核之上的 linux 本身这个操作系统的版本呢,那据我了解呢,也至少有三百种了 啊,这个就是 linux 系统的一个简单的一个发展,大家了解一下啊。然后第二个部分呢,我们要来重点讲解一下 linux 操作系统一个组成结构,那它的组成结构呢?我们可以从这个图啊可以看得出来。那么一个 linux 操作系统呢,它主要的组成结构呢?是由三个部分组成, 一个是包裹在这个硬件之外的,叫做 kernel, 我 们称为内核啊,称为内核,那在内核之外呢,又有一个叫做 shell 啊,然后呢还有一个叫做 file systems 文件系统,然后最外面呢,我看到是用户啊,也就是用户是通过 shell 在 使用内核,我们可以通过这个图看得到,对吧?那什么是 kernel? 什么是 shell, 对 吧?有什么作用呢?我们具体的来了解一下。 colonel, 我 们叫做内核,它是包裹在我们这个硬件之外的啊,那么我们要与硬件去打交道,都要通过这个 colonel, 所以 说这个 colonel 它里面呢都是一些非常核心的一些程序系统程序, 它它呢可以用来管理我们的硬件设备,管理我们这个系统里面的进程、内存、交换空间、文件系统精灵进程,精灵进程其实也就是守护进程啊,那么它是包裹在硬件之外,也就说我们是通过它来使用硬件的,所以说它可以控制我们的系统程序与硬件之间打交道,这样的一个功能 啊,要通过它来使用,所以它里面都是非常核心,非常底层的一些程序。然后 shell 呢,我们说是包裹在内核之外的,叫内核之上的,对吧?叫外壳 shell, 它是包裹在内核之上的,而且 shell 你 看呢,它是位于用户和内核之间的, 所以说我们说 shell 呢,它的作用呢,是提供了一个人机交互的界面,它是我们用户和内核之间打交道的功能,就是我们通过使用 shell 来使用我们的另一个操作系统 啊。而大多数时候呢,我们说命令系统呢,是通过命令的方式来操作的啊,所以说我们说 shell 呢,它又有点类似于像我们 windows 里面那个 come on 的, 我们知道那个 windows 里面你运行 come on 的, 它是一个 黑黑屏,对吧?然后一个命令窗口,你可以在里面通过命令来操作。这个 shell 就 有点类似于它啊,那我们是通过命令方式来与 carl 打交道,所以说 shell 它其中还有个作用,就是它可以解释我们用户输入的命令操作命令。 那么随着 linux 操作系统的这个版本的不断的发展呢,那么 cio 呢,也有很多不同的版本,不同的 cio 呢,它对命令的解释不一样,但我们不用管它,我们只是使用它啊。常见的 cio 呢,有最早的一个 cio 和 kio, 还有像 cio, 后来的 cio, cio 和后来的 bio, bio 实际上是对最早的这个啊, brunio 的 一个 升级啊, t c o 啊,这些都是不同的 c o, 那 么这些不同的 c o, 我 们最常用的就是现在的另一个操作系统里面,最常见的两个版本就是 c o 和 b c o 啊, 那么不同的 c o 呢,它在这个使用命令的时候,它的命令提示服务也会不一样。我们后面安装了另一个操作系统以后,大家会进一步的了解到,可以去验证一下。那么常见的 c o 和 b c o, 在管理员的用户情况下呢,他的提示符是井号,而在普通用户情况下呢,他是一个 d r 号。如果是 c c o 的 话呢,他的管理员用户呢,是井号,而普通用户呢,是百分号。也就说如果以后你们在使用另一个超系统的时候,你可以通过这个提示符来区分, 如果你看它是 dollar 呢,那么它应该是一个 bar shelf, 如果你看它是个百分号呢,那么它应该是个 c shelf 啊,这就是 shelf 啊。然后第三个部分呢,我们说是文件系统,文件系统呢,当然是用来组织管理文件和目录的,那么文件系统具体的一个情况,我们会在后面专门来讲解 啊,那了解了它的组成结构,我们再来看一看它的特性啊,那例子的特性呢,非常的多,首先呢是多用户,那么例子这个多用户呢,我们说它 至于支持许多用户账户,而且可以让多个用户在同一个时间登录到系统中,同时工作,每个用户呢,还可以自己去定制自己的一个环境啊。而 linux 中的这些用户呢,它启动的这些应用程序啊,都是在 linux 的 服务器上来运行的,而不是在桌面 pc 啊,这不是终端运行了啊,这是它的一个很大的一个特点啊。 linux 操作系统是可以作为应用服务器的,而 windows nt 我 们知道它许多程序都是分为服务器端和客户端应用程序,并不是完全运行在服务器上的,对不对?你像我们的 dos 控制台运行,就能说明 我们的 windows nt 跟 linux 多用户支持上一个区别了啊。然后第二个呢,它特性呢,是多任务啊,它可以同时运行多个程序,而且这些程序呢,不仅仅是我们用户在线的用户所启动的程序,还有很多是本身 linux 系统本身自带的一些系统后台运行的进程 啊,那它能支持多任务呢?当然就有有它的这个多进程,多现成的一个机制。 好,那第三呢,它支持多平台啊,那么应该说 linux 所支持的平台是历史上最多的了,像有上的 spark 啊, 还有这个阿帕奇的 macos 啊,像 power pc, 还有像惠普,还有像英特的叉八六啊, x 八六系列的这些计算机,那它都支持,包括像 pda 的 一些装置它也支持,当然,嗯, 之所以能支持呢,主要是得益于我们 linux 这个操作系统,它大部分的代码呢,都是用 c 语言来写的啊, c 语言呢,具有比较好的一致性,尤其是在对于这个不同的硬件平台啊。 然后第四个呢,我们说它也支持图形化的用户界面 g u i, 因为 linux 呢,它传承了我们 ulex 强大的图形用户界面 x window 这个协议啊, x window 呢,是支持图形化应用进程正常工作的一个框架,一个协议,它可以与我们 g u i 应用进行通信,并在 x 服务器上进进程啊,在 x 服务器进程上来进行一些显示啊。然后另外呢,我们说它还有一个特点呢,就是它的硬件支持非常好啊,那六个是对硬件的要求是非常低的 啊,所以说它的这个移植性也比较好,就是你非常低的配置,你都可以去跑另一个超系统啊,还有非常强大的这个通信和联网功能啊,它支持啊,种类繁多的像网卡呀,调制解调器啊,串行等连接设备,而且它也支持局域网的一些, 像 token, ring 啊啊,还有像这个 asteroid 这样的一些协议,而且它还内建了很多上层网络协议,像 tcp 啊, novel 啊这样的一些协议,并且呢, 它有各种的一些软件包啊,它可以提供一些各种软件包让我们来搭建,像文件服务器啊,打印服务器啊, web 服务器啊等等,没有服务器啊等等啊。另外呢,它对应用程序的支持也比较强大啊,它可以这个支持像 有编辑器啊啊,编辑器像 vr 啊,图形化的 gedit 啊啊,编程工具啊, g c c, g d b 啊啊,这些都都非常都都有 mac 呀,数据库像 micro 啊,还有像 oracle 啊,办公软件 像我们比较有名的 call word, perfect 还 start office 等等啊,图形处理也有向上 xview 啊, gimp 啊, snapshot 这样的一些图形处理软件啊,网络应用像网警, landscape, communication, 还有阿帕奇 啊,游戏那就更多了啊,游戏等等也也都支持啊。好了,那么这就是我们这一讲的主要内容,那么在这一讲里面呢,我们重点要去掌握的是 linux 系统的一个组成结构,以及它这个结构里面的 作用啊,这个里面的作用,了解一下它的发展和特性啊,好,感谢大家的收听和收看,我们下一讲再见 容啊,那我们上一讲呢,主要呢给大家介绍了我们另一个操作系统的一些基础知识啊,主要呢简单给大家介绍一下发展和它的特性。重点呢给大家分析了另一个操作系统的一个组成结构啊,以及每个组成部分它的一个作用 啊,那么对这个部分有了简单的了解以后呢,今天我们进入第二讲,也是进入我们的第二个部分,就是我们 linux 操作系统的安装,那这个部分呢,我们主要的内容和要求是什么呢?我们来看一下,那这个部分我们主要要求大家首先要了解 linux 系统的 版本以及选择。第二个呢,了解我们即将要给大家介绍的这个乌邦图啊,它的一个不同的版本, 理解 linux 系统的一个登录,然后呢掌握我们这个啊,这个啊,微软和无帮图官网的使用以及下载软件。然后呢掌握无帮图的桌面和服务器的一个安装啊,我们这个部分的一个 要学习的一个目标。那么在这里面我们重点呢是要学会我们 linux 系统无帮图的一个安装啊,一个安装 考核呢,也是考核它的安装啊,那么课后呢,我是希望大家通过我们这个学习呢,你们能够去安装一下我们的无邦图系统,或者是安装 red hat 啊,红帽子, 这是我们这个部分的课程目标啊,一个介绍啊,中难点那个介绍啊,好,那么现在我们就进入我们这个部分的第二讲啊,那么第二讲呢,我们要给大家介绍的是 linux 系统的一个选择以及安装的一个准备啊, 那么这个选择完成准备呢,我们先来了解下另一个系统的选择,我们先要介绍一下我们现在比较 常用的或者用的比较多的啊,这样的一个另一个系统,那么就现在来说,我们用的非常多的另一个系统呢,主要的主流的啊,应该是有两个 啊,有两个,那么第一个我们叫做 red hat 啊,红帽子 red hat 呢,现在呢主要应用在企业级啊,主要是应用在一些企业级版的啊,而且,呃,它的这个系统呢,就是如果是商用的话呢,那么已经开始收费了啊。 还有一个呢,就是比较多的呢,就是无邦图啊,无邦图,那无邦图呢,我们说它是用于这个桌面桌面的,而且是开源的 啊,就是说它不收费啊,那无帮图呢,也是我们这个课程所选用的 linux 操作系统,我们会用这个系统来给大家进行讲解啊,那为什么会选它呢 啊?我们说无帮图呢,也是就现在来说,在 linux 系统里面啊,它应该算是比较纯正的 linux 系统 啊,而且呢,我们知道我们学这个课程呢,是作为嵌式的一个基础开发啊,那么嵌式的基础开发,那么将来还会涉及到安卓的一个开发,安卓底层的开发,那么吴邦图这个操作系统呢啊,那个操作系统呢,他也是安卓官方指定的一个翻译操作系统 啊,所以说我们学习他呢,可以为将来的后续的一些啊课程的学习呢,打下一个基础,做一个铺垫啊,而且他也发展很快啊,就现在来说,无邦图他已经支持 arm 架构了啊,也也也为我们的嵌式这个开发 做了非常好的一个铺垫啊,所以在我们这门课程里面,我们会选用无邦图这个 linux 操作系统来进行学习啊,这就是 linux 操作系统的一个选择啊。 那么第二个呢,我们来看一下,既然选择,那么我们选择了它,我们当然就来安装它,那安装的我们要做哪些准备呢?我们看下安装前的准备。首先我们肯定有电脑啊,那么电脑呢,我们要做好相应的一些硬件配置,所以我们的硬件准备。 那么前面我们在讲 linux 特性的时候,我们已经提到过,我们说 linux 操作系统它对硬件的要求是比较低的, 对吧?所以说这个硬件的准备呢,就现在来说,就我们现在的电脑 pc 机来说,基本上你现在去买,在电脑城去配一个电脑,或者买一个品牌机,基本上都可以满足,就说没有什么 很特别的,什么什么要求啊,因为他本身对硬件要求就不高啊,所以说现在的电脑基本上都可以满足的,所以你不需要去担心你现在买的电脑啊,不,不能安装他啊,不存在。 然后第二个呢,软件准备,软件准备呢,这个地方我们要简单说一下啊,就是说我们现在安装这个命令操作系统呢,我们为了 方便操作啊,为了方便我们的操作,我们现在大多数情况啊,也是很多比较常见的情况呢,都是在 windows 系统下,通过这个虚拟 虚拟机虚拟环境,通过搭建这个虚拟机的虚拟环境来安装我们的这个零六个操作系统啊,因为我们知道一个硬件平台,如果你去装双系统的话呢,一个是消耗资源比较大, 第二个呢那个也不方便我们这个课程的学习和讲解啊,因为你两个系统切换是很麻烦的,对吧?所以我们这个地方就选用的是在虚用,利用虚拟机来虚拟 这个环境,在虚拟环境下来安装啊,所以软件的准备呢,我们首先就要有一个虚拟机叫 when where where 啊, v m where 啊, 啊,那么这个软件呢,可以到它的官网啊,这个三 w wenware 官网去下载啊,那么现在这个虚拟机呢,有两种啊,有两种 版本,第一种叫做 winware player, 然后另外一个叫做 winware workstation。 啊,那么这个是用用于工作站的啊,这个呢是用于普通的用户桌面的啊,桌面上用的那, 嗯,这个呢,如果是作为商用的话呢,他是要收费的,当然我们我们如果是作为个人个人用户去使用,现在这个网上也有很多他的破解版啊,有很多的破解版也可以用啊,也可以用。这两个呢都是一样的啊,都是虚拟机啊,都是虚拟机 啊,好好,那我们到他的官网去看一下啊,我们去看一下这个虚拟机的官网。 好,我们可以看到它自动会进入中文,对吧?如果你要进一步的了解呢?你想下载呢?你可以下载软件或者点击下载, 对吧?它就进到下载这个页面,下载这个页面,你看它有很多不同的版本,对吧?这是云的,基于云的云版本, 对吧?啊,这是操作系统,这操作管理结构,管理安全网络,还有桌面和普通用户用的啊,你可以在这想啊,可以在这边下,也有试用版,也有产品啊,还有其他,对吧?啊,你也可以下免费下载试用版 啊。啊,那这个里面呢?我已经就是下载好了啊,我啊已经下载好,我是下载的十这个版本啊,那么后面我们就会来安装啊,会来安装,当然你在这个地方不方便,你也可以到百度,我们知道百度里面有很多关于它的破解版 啊,有很多破解版你也可以去下,比如你随便输一个,你就给个 win win when where, 对 吧?啊?然后 workstation 十二十一都有,对吧?你,你需要什么,你下载什么,对吧?我下载的是十,对吧?你也可以去下载啊,这都可以用 好,这个是我们说的虚拟机啊,然后接下来我们要准备无帮图软件,那无帮图软件呢?我们也可以到它的官网去访问一下, 对吧?啊,我们进入到这个无帮图啊,进来之后呢,你可以看到它的 页面,对吧?啊,那如果我们要去下载我们所需要的,我们可以到下载这个里面,你看你选了下载,你看这就有很多,对吧?啊,你点击这个下载,然后就进到下载这个页面,那在下载这个页面里面呢,你就可以看到。哎,我们无帮图这个 软件啊,其实它也有很多版本啊,主流的,你看这里面有 disco 桌面版、 server 服务器版,桌面版就是我们用户桌面用户使用的,那它肯定是支持图形界面的,然后服务器版,那服务器服务器版呢? 大多数情况那肯定是没有图形界面,它主要是以命令方式。还有一个云版本啊,还有云版本啊, 还有它的结构 download, 对 吧?啊啊,就是下载,它有很多的版本,所以说我们说无邦图也有很多版本啊,那它安装方式呢?我们可以看到安装方式最常见的就是一般就是要么就是 windows 的 安装文件,下载什么 ios iso 的 镜像文件,或者是 erp 的 安装文件直接安装。还有种它有发布的 cd 啊,可以 cd dvd 的 方式安装,也可以 usb 的 方式安装,对吧?那这个呢,你可以到它的产品 shop 这个地方,你可以去看 啊,未看图方的商店,你看它这就有 cd 的 dvd 软件,对吧?啊,也有也支持这样的一些版本啊,也支持这样的一些版本。 那下载下来之后呢,我们这一方主要去下载的就是下载桌面和服务器版 iso 的 文件,镜像文件,我们后面呢会来安装,所以你到这个里面,你就在我们的下载这个页面去就可以了啊,在 download 里面可以就可以了,而你找不到 download 呢,你就回到首页嘛, 对吧?你回到首页又进入当漏的吗?你看这有三个的吗?你要下桌面板,这就进到桌面板,你看现在最新的是十四点零四点三,而我之前下的是这个 十四点零点四点三,对吧,就是它的最新版本,对不对?你也可以在这下,它有支持六十四位,它有三十二位,一般我们现在机器基本上买的话呢,可能多数同学都会选六十四位的啊,但你可以根据你机器的配置啊,根据你机器的配置 啊,但这个下载过程我就不去演示了啊,因为下载过程呢,这个比较慢啊。而这个 lts 是 什么意思呢?长周期,就是以前那个版本更新很频繁, 那现在这个呢,更新他可以支持的时间比较长了啊,就这个意思啊,好,这个是他的这个官网的一个软件的一个下载的情况啊,给大家介绍一下。那你们接下来这节课完了之后,你们要去做的就是到这个官网上去把虚拟机和 这个无邦图的桌面和服务器版的镜像文件都把它下载下来准备好,那么我们下一节课呢就会来讲这个安装啊。好,那么我们这一节课主要内容就讲到这个地方啊,感谢大家的收听和收看,我们下一讲再见。 我们上一讲呢,主要给大家介绍了 linux 操作系统安装的这个部分的第一个小讲, linux 的 选择和安装准备啊,那么我们介绍了这个常见的两种 linux 操作系统以及它们的特点啊。 嗯,然后呢,另外呢,我们介绍了它的安装的一些准备,包括硬件和软件,硬件呢没有什么特别的软件准备呢,我们讲到了 这个虚拟机和无帮图的两个软件的相关的内容啊,那么分别可以到他们的官网上去下载, 而且无帮图呢,我们说他有三个版本,我们对这三个版本呢进行了一个简单介绍,并且对他的安装方式呢也进行了一个简单介绍,而我们要求下载桌面和服务器两个 版本的 iso 的 安装机箱文件。这样的话呢,我们这一讲呢就可以来安装它啊,安装它,那在上一讲呢,我们已经下载好了虚拟机和无邦图的安装文件,那这一讲呢,我们就进入安装无邦图 桌面板和服务器板,那么安装魔方图的桌面和服务器板呢?我们是要在 windows 系统下再来装一个 linux 系统,那么所以我们需要先安装 winware extension 这个虚拟机,我们在虚拟机的上面来装这个 linux 系统。 好,那么在 windows 二中去配置和新建新建我们的无棒图系统,那我们来看一下怎么来做。首先我们先装我们的虚拟机,在我的地方已经下载好了 windows 二啊,我们下载的是十大家,现在新版本有十一有十二了,然后你可以去下载新的。 好,我们下载然后安装,它会进入到这个安装的向导啊,就可以进入下一步, 然后呢选择接受下一步,然后呢你可以选择自定义,可以选择典型,我们一般就选典型,因为我们典型就足够够够我们用了。还说启动点的产品更新啊,这个你不用,反正你以后三三六零里面你可以去更新它 啊,这个就不需要桌面上有图标,然后程序夹有继续,然后就开始安装了 啊,大家记住啊,虚拟机的运,这个程序图标是这样的啊,这样的一个程序图标啊,所以以后大家在桌面上看到这样的图标,应该知道它是一个虚拟机啊。 where? 那 我们为什么要在虚拟机环境下来装呢?因为我们是要在 windows 系统上来安装另外一个操作系统,而虚拟机实际上就相当于什么呢?它就相当于模拟了另外一个机器, 那在这个机器里面装的 linux 操作系统,所以这个虚拟机它的功能很强大,如果没有它的话呢,我们直接装 linux 系统,那么就会在我们的系统里面形成一个双系统, 那这样的话呢,我在使用 windows 和 linux 就 很不方便了,我就不能进行切换啊,而虚拟机呢,就可以使得我这两个系统的切换呢,非常的方便,非常的方便 啊,那么正在安装很快呢,我们也就会安装完了,安装完了之后呢,这会有一个它的注册,注册机啊,我们要对这个虚拟机要进行一个注册,否则你使用的时候呢,会会是试用版啊,用不了多久就失效了啊,用不了多久就失效了, 好了,他说这儿正在执行我们的安装,可能需要几分钟的时间啊, 我们这个稍微耐心的等待一下, 所以我们这一讲主要就是给大家这个讲解,安装好,你看要求输入密钥,这个时候我们要打开这个注册机 啊,选择这个 generator 或者这个注册码,然后进入到它这个安装向导里面来填写啊,然后输入, ok, 完成完了,关了。好,这样的话呢,这个就安装好了,虚拟机就安装好了,那么我们在我们的桌面上就可以看得到这有个虚拟机的图标,看到了吗?啊,那我们怎么来安装虚拟机上安装这个无邦图呢? 我们双击这个虚拟机图标,他会打开这个虚拟机啊,那在虚拟机里面他有创建新的虚拟机,打开虚拟机 连接远程服务器,物理虚拟化物理机,对吧?而我们就是要去新建一个新的虚拟机,我们要在新新的虚拟机上来进行魔方图的安装啊,这呢它可以自定义,这也可以是典型 啊,那我们可以看一下,如果是典型的话呢,选择以后还会你是否通过镜像文件?我们就是要通过镜像文件啊,所以我这就选择我的下载好的无帮图的什么镜像文件来找到无帮图的镜像文件, 嗯,在我们的,在我的电脑里面,应该是, 我是放到我的这个里面的,对吧?我们找到我们的这个无光头的软件,那我们用的,我们现在是普通用户在自己的电脑上用,我们可以就选择一个桌面版,因为它是带图形界面的啊,我们打开它, 好啊,检测到了啊,六十四位的,对吧?好,然后下一步他问你,你取个名字,那你就叫 鲁邦图,对吧?用户名呢?随便取一下,你可以取自己的用户名, 那密码你可以取简单一点啊,名字啊,然后呢位置,他问你这个虚拟机安装的位置默认,他有一个默认虚拟机的位置在这个用户文档这个下面啊, 那你可以改,不过我们这个地方呢,就就认他默认吧。啊,没关系,那他说你设定多大的磁盘大小来供这个虚拟机,虚拟机的硬盘是作为一个和多个文件存储的主机的物理磁盘中,所以你就说你要用多大的硬盘, 我们要不了这么多,我可以给一个十 g 嘛。啊,当然你是六十四位,你可以用二十,建议用二十 g, 对 吧?你用二十 g, 然后他说你将这个虚拟虚拟的这个系统安装进去之后,你是成为多个文件还是单个文件?一般我们成为多多个文件啊? 好,然后他就给你显示名称,位置,版本,系统,硬盘,内存啊,网络适配器,还有其他的设备。那你对这些你需要进行调整的话呢?你可以在这自己定义一键,你可以调整,比如说内存, 你用一个 g 的 内存,你觉得多了你可以降,对吧?那一般我们都是我们的内存是两 g, 我 们一般呢建议用一 g 啊,然后处理器,我们这个是, 这个是四核的啊,那么针对你那个系统呢?我们用一个就够了啊,核心处理器你要用两个也行,他可以更快啊,那我们用两个 对吧?合起四个,每个处理器核心数量,对吧?你就用的比较多了,你可以用用处理器数量两个,这样的话他就会更快一些,然后这是设置 这个它的 iso, 镜像文件, dvd, 然后网络啊,你的网络适配器我们一般就默认 usb 啊,可以自动连接啊,你要支不支持 usb, 就是 你的虚拟机这个系统支不支持 usb 声卡,对吧?打印机这种检测, c s g 这种检测,这些我们都可以默认关闭,就调整好了。然后呢?创建后就开启这个虚拟机啊,是不是我们就完成可以 让它创建后就帮我开启它就开启了啊? 开启后你看单机虚拟屏幕可发送按键,简易安装。正在安装六十四位无邦通,看到了吧?啊, 它现在这个 wifi 二正在连接更新这服务器详细信息,你可以看详细信息更新它, 如果我们不想它这个更新呢?我们可以把它关掉,然后在这个地方,你看这个里面就在安装,进入到我们的无邦图的安装了,看到没有拷贝文件好, 这个安装过程就比较慢了啊,我们可能需要等待一下,那这个地方我们就暂停一下啊,我们就暂停一下,嗯,这个等安装完了我们再来看哈, 进入到文件的拷贝了,你看好安装好我们无帮图,这个以后呢,大家可以看它进入这样的一个界面,让我们去登录。那我们知道 linux 操作系统,它是一个多用户系统,所以每个用户要使用这个系统的,它都有一定的权限安全控制,需要去登录, 那这个地方要求我们输入密码,我们输入什么密码呢?这个地方他默认的密码就是我们在配置安装这个系统的时候,我要那个地方要我们输入的用户名和密码,而我们在那个地方输入的是用户名是 w j, 对 吧?还记得吧?那密码我也是用 w j 回车, 他就以这个用户登录到了这个系统里面。那现在大家看到登录到的这个系统呢?我们可以是可以看到他的这个图图形界面的啊,他是一个有这样的一个桌面啊,图形界面这样的一个桌面。 那么我们知道我们使用的大多数的我们的这个命令操作呢,都是通过这个命令的方式 啊,通过命令的方式,那我们如何从这个图形界面切换到这个命令方式啊?那么我们看一下从图形界面要切换到命令方式呢? 有几种啊?一种呢就是通过 ctrl alt 加上 f f 三, f 四啊,我们可以看一下 f 三, 进到这个里面 ctrl alt 加 f 三,它就以终端的方式,然后这个地方你可以输入用户名密码登录,你看它是显示的什么 d r, d r 是 什么?什么八写?什么写?哦,在我们前面是不是讲过八写哦,它的提示符普通用户就是 d r 啊, 对吧?那如果我要从命令方式再切换回我的图形界面呢? ctrl alt 加 f 七。 那大家看到图形界面他也有桌面,而且在这个桌面上他也支持很多的图图标,你看这个图标是什么文件操作,他有提示,就是你单机他,他就会进入相关这个文件,而默认的目录是进入到用户的主目录后 啊,有文档下载的,对吧?音乐,然后他也有 firefox 的 支持,就是你可以直接在这个里面上网 啊,如果你是联网了的,那么在这个里面它也可以联网,然后这个地方也还有相关的 office 的 一些组建,像 office 的 一些处理啊, office 的 演示啊,文档啊,表格,你看这儿 google 默认进 google 啊,这个就是我们安装好以后的无方图,那安装好以后的无方图如果我们要关闭怎么做啊?在这儿选择 下了单,然后选择下了单关机,它就会关掉,关掉会显示一系列的关闭信息,它就会自动关掉了。好, 那这就是安装无帮图系统,那这里我们安装的是桌面版,对吧?那如果你还想安装其他服务器版怎么办?主页,你可以再创建新的虚拟机,然后在这个地方你选择什么服务器的这个 ios 应用键, 然后你看这个地方就会要求你输入用户名密码,注意这个地方的用户名和密码就是你将来登录这个安装好以后的这个系统的用户名和密码,所以这方你要记住啊,一定要记住啊。 ok, 好, 那我们本讲的主要内容呢, 就给大家说到这个地方啊,那么我们要求大家要做的事情是什么呢啊,要做的事情就是 干什么? 就是能够去安装我们无邦图的桌面和服务器板啊,去安装无邦图的桌面和服务器板啊,大家记住, 这个地方的安装我已经给大家介绍了啊,好了,我们感谢大家的收听和收看,我们下一讲再见。 好,那么本讲呢,我们主要给大家介绍的是无邦图桌面的一个安装,然后服务器的安装呢,我希望下来大家自己去安装一下,按照我们桌面版的安装方式,同样的新建虚拟机啊去安装。那么如何在图形和命令模式的切换呢?刚才我们在 讲解的过程中也给大家做了演示啊,通过 ctrl alt f 二、 f 三、 f 四、 f 六都可以从图形转到命令,它们是以不同的终端的方式,而且它是一个 bash u, 对 吧?然后呢要回到图形呢,我们用 ctrl alt f 七 啊,那本讲的主要内容呢?主要就是这些啊,那这个感谢大家的收听和收看,我们下一讲呢,主要就是这些啊,那这个感谢大家的收听和我们下一讲呢,主要就是这些啊,那这个感谢大家的是 linux 系统的安装, 然后呢我们介绍了如何来安装无邦图的桌面板和服务器板,以及安装以后我们怎么来简单的登录使用啊,图形和命令的切换啊,那么了解了这个部分以后呢,那么对于我们基础部分的命令操作的安装我们就介绍完了, 那么今天我们要进入到第三个部分,就是 linux 文件系统以及文件的一些基础知识的介绍。那首先我们先来了解一下这个部分我们主要的一些目标和考核重难点啊,那么我们的目标第一个就是我们要了解文件系统的基本定义和功能。 第二个呢,我们要了解一下 linux 文件系统。第三个我们要理解不同类别的文件系统以及它的作用, 然后理解文件系统的基本的组成,理解 linux 文件系统的特点。然后呢,我们要重点去掌握 linux 文件系统的目录结构,内容特点以及作用,掌握 linux 系统的登录和使用 ls 查看目录文件 好,那重点和难点呢?主要是对于不同类别的文件系统以及它的作用要理解和掌握。第二个就是 linux 基本的登录和使用 ls 去查看目录文件 好,那么考核呢,就是对于不同类别的文件系统以及它的作用我们要掌握,我们要考核这个,而我们后面呢,我们会有什么练习呢?首先练习登录退出, 然后练习 ls 去查看,练习 ls 查看我们系统的文件和目录结构啊,而且通过不同的 文件标识和颜色来识别不同的文件类别啊,那这个里面呢,会涉及到一些小的一些名词啊,像 y t 三 j f s s r y f s 这些我们在会后面的课程中都会去讲解 啊,好,这是我们这个部分的主要的课程目标,重难点以及考核目标啊等等的一些介绍。那现在我们就进入这个部分的第一个小讲啊,首先我们来了解一下文件系统的基础知识,文件系统概述,在这个部分里面呢,我们主要给大家介绍的是文件系统定义、 分类和功能啊,也就说如果我们要去设计一个操作系统上面的文件系统,我们要从哪些方面着手,对吧?那我首先肯定要了解它这个基本的功能,对吧?而且它到底是不是一个文件系统,对吧?定义 好,那我们来看一下。首先文件系统第一,那什么是文件系统呢?我们说文件系统啊,它是一种组织计算机文件和资料的方法啊,比如像 windows 系统上,它的文件系统是通过什么方式组织? 像塑形结构一样的方式在组织,对吧?而且呢,他有资源管理器来进行管理啊,所以说文件系统其实是一种组织计算机文件和资料的一种方法啊。那么在操作系统中,这个文件系统到底是什么呢? 我们可以把文件系统本身可以看出是一个程序,而这个程序呢,是属于系统机的,就是比较高级的程序啊,这他是属于操作系统中已经被我已经 为我们封装好的一个系统服务程序,其实它也是一个软件程序,只不过这个软件程序它是用来存储和管理计算机文件和资料的 啊,这就是文件系统。第一个文件系统其实也是一个程序啊,我们也可以去设计它,我们也可以设计啊,在某一个操作系统去设计它,那要设计它,那么 肯定要了解它的一个功能,对吧?那文件系统的功能是什么?如果你来设计文件系统,你应该让它具备什么样的功能?那么我们说文件系统的功能,第一个他应该是可以去定义我们文件的一种组织方式,比如说文件结构 啊,文件结构用什么样的方式来组织?比如说在我们现在的文件常见的文件系统里面,就是以目录啊,目录目录数这样的结构。 然后第二呢,你文件里面的这些内容怎么来组织,对吧?有文件结构,文件要存储在我们的磁盘上,又怎么来?怎么来组织,对吧?所以要定义文件的组织方式。文件结构第二呢,他应该是可以提供一个存建立和存储文件的环境, 比如我们通过目录文件,对吧?建立目录,建立文件来存储文件。第三个呢,他要能对文件处理器空间进行组织,比如说你这个文件建好了之后,你是要存到我们的硬盘或者存到一个处理器上的,那处理器上的空间怎么去组织和分配,对吧?他应该具备这样的功能才能存到我们的磁盘上吧? 那另外一个你想他要肯定要负责这个文件存储啊,能够进行存入取出,并且能对存入的文件呢进行一个保护和检修啊,保护和检修啊,然后呢负责建立文件, 能够去建立文件存入、读出、修改、转出文件、控制文件的存取、撤销文件,等等,对吧?啊?也就是说一个文件系统他应该具备这样的一些功能, 它才能够称之为文件系统,才能够真正的实现管理和存储我们计算机上的这些文件和资料存取,对不对啊?所以这文件系统功能, 然后了解文件系统功能以后呢?那么我们来了解一下常见的一些文件系统有哪些啊?那么常见文件系统呢?我们可以分为这么几类, 第一个词盘文件系统,词盘文件系统呢?常见的像 windows 下面的 ntfs, 对 吧?还有 f d 三二, 还有 e t 三, e t 三其实就是 linux 的 文件系统,它是基于日制的啊,基于日制方式我们后面会详细讲,然后如果是闪存,比如说我们的 u 盘闪存, 闪存的这种存储形式,存储戒指的这种啊,那么它的闪存文件系统呢?采用的 g f s r, 然后 y a f s, 常见的这个用的比较多啊,大家可以在百度上去了解一下。然后数据库文件系统,数据库文件系统就是数据库的这些数据,最终其实它还是存到文件的,那它的文件系统用的是什么呢?有 bfs 和 winfs 啊,然后呢,这是网络文件,这是我的文件在网络中传输的时候,那么网络文件系统用的是 nfs, 那还有些虚拟文件系统 vfs, 那 么什么是虚拟文件系统呢?虚拟文件系统呢?是这样的啊,就说我们有很多不同的这些文件系统,对吧?不同的操作系统,它也支持不同的文件系统, 对吧?啊,那我在访问,那不同的文件系统呢,那么他的这些功能的定义,文件结构啊,目录啊,以及空存储空间的分配组织啊,他的实现方式都不太一样,对不对啊?那么我虚拟文件系统是用来干什么呢?就是 我用不同文件系统,那么我在使用它的时候,它的由于它这些功能定义都不一样,所以我使用的方法也会不一样,这就使得这些不同文件系统它的一致性比较困难,对吧?就说我不同,我用户针对不同文件系统,我都要去学习一套它的实现方式,对不对?而 虚拟文件系统呢,就很好了,虚拟文件系统它定义了一套标准的接口,就是标准的实现方式,而 这些不同的文件系统呢,最终都由这个虚拟文件系统进行了一个转换处理。而面向我们用户使用者来说,他都是什么使用的统一的标准, 而由虚拟文件系统呢,转化成具体的不同文件系统的实现方式,这就是虚拟文件系统 啊,这是虚拟文件系统。好,那么这是我们这一讲的主要内容,那么我们这一讲主要给大家讲的是文件系统的定义,就是文件什么是文件系统?是用来干什么的,对吧?然后他有哪些文件系统,然后他文件系统,如果我们要来设计文件系统,应该具备什么样的一些基本功能, 对吧?啊?基本功能好,那么重点呢,大家要找文件系统基本功能以及它的分类啊,以及虚拟文件系统的一个特点。好,那么这一讲呢,我们就讲到这个地方,感谢大家的收听和收看,我们下一讲再见。 我们上一讲呢,主要给大家介绍的是 linux 文件系统,文件系统的基础知识几个部分,那么我们上一讲呢,介绍的是文件系统一些基本概念啊,包括文件系统的定义、 分类,还有它的功能啊。什么是文件系统?常见的文件系统有哪些?那么如果我们来设计一个文件系统,它应该具备哪些功能,对吧?这是我们上一讲给大家讲的内容, 那么了解了这些内容之后呢,那么这一节我们重点要给大家介绍的是 linux 这个操作系统,它的文件系统以及文件的一些相关内容。那首先我们要介绍的是 linux 文件系统以及它的特点啊,那我们来看一下 linux 文件系统,那 linux 文件系统呢?呃, 主要呢是有两个类型的文件系统,第一个就是 e x t 三啊,这个在我们前面上一讲呢,也提到过,对吧? e x t 三是是一个什么样的系统呢? e x t 三,它是一个基于日字方式的文件系统 啊,它是一个基于日字方式文件系统。那么什么是基于日字文件系统呢?就是系统中每个文件它都会有,所以 啊,他都会建立,所以而我们的用户对这个文件的每一个操作啊,他都会去记录日记,然后呢形成一个任务队列啊,牌子执行 啊。那这样的一个日式操作系统他有什么好处呢?第一,因为他每个文件都有,所以而且用户对文件的每个操作都有日制, 这样就使得他可以什么呀?他可以监控用户对文件的一个操作,就是如果某个用户对文件进行操作以后,系统发生了什么错误,或者是一些类似于崩溃这样的问题,他可以通过查日记得到相应的记录,从而能够什么进行很好的这个 这个检修,或者是进行很好的一个更改啊,修复啊。那第二个呢?他把用户的每个操作记录成日记以后呢?他 不一定是说这个马上就去执行,他可以形成一个任务队列,排着一个一个执行 啊,这是 e t 三这样的一个日字系统,那它除了 e t 三这样的一个格式的日字系统文件系统之外,它还支持一个 swapp 啊, swapp 这样的一个文件系统。 swapp 这个文件系统呢,主要是用于交换分区的一个文件系统。 那什么是交换分区啊?这个地方可能大家太理解啊,那交换分区我们可以把它理解成像 windows 下面的那种虚拟内存 啊,有点像 windows 虚拟内存,就是当我们内存不够的时候,我们会把什么硬盘上的一部分空间作为内存 啊?那虚拟内存的实现呢?一般常用两种方式,一种呢就是进行内存的排列,像内存池一样进行一个优化,就是说内存不够的时候,他会对内存 的一个空间进行一个排列,解锁排列像内存词一样,然后给他进行优化,再进一步的提升他的利用率啊,这是虚拟内存的事情第一种方式。那第二种方式呢?就是我刚才说的,他会把硬盘上的空间一部分模拟成内存 啊,而这个 swapp 交换分区的这个文件系统,这个 swapp 实际上就是 linux 系统上的一个虚拟内存,它在安装的时候就会要求我们设置大小啊,一般呢我们会设置为物理内存的两倍啊,物理内存的两倍 啊,这个是我们说交换分区连接到 swapp 啊,如果你们去安装这个,如果是安装我们的这个红帽子啊,如果安装红帽子就有就会有这个设置啊,我们安装无方图呢,桌面版的还好一些啊,没有这个设置啊, 他会默认的为我们设置好了,不要求我们自己去设置啊。有有这个设置啊,这是 linux 操作系统,它的文件系统 最重要的两个文件系统,大家要知道,而且要了解它的一个特点啊,那么有基于自制这种方式,它的性能肯定是比较好的啊,因为它会形成一个任务队里拍着自行啊,慢慢自行。 好,那了解了 linux 文件系统以后,我们来了解一下 linux 文件系统的一个特点。在 linux 文件系统里面啊,在 linux 这个操作系统上,它的文件系统,它对文件的理解啊,我们可以认为是 linux 系统,它认为 在系统中的所有的东西都是文件,就说一切皆文件啊,哎,这个系统,他甚至可以把设备像硬盘啊,光驱啊,软驱啊等都看成是文件,而你可以把文件夹也看成是文件, 所以说在另一个系统中,他认为所有的东西都是文件,一切皆文件。那么对于不同的文件,我们知道在 windows 下,它可以通过扩展名,什么 ex 一 啊, 啊,什么 d a r r 啊,对吧?那什么 s y s 啊等等这样的一些后后扩展名来区分不同类型的文件。而那个操作系统里面,由于它是一切皆有文件,而且那个操作系统它的特点呢?它对文件这个文件名啊,它的特点是它是没有扩展扩展名的 啊,文件他文件是没有扩展,他不支持扩展,那他怎么来区分他的这些不同类型的文件呢?他是通过不同的一些标识啊,那常见的呢,我们可以有这样的几种,普通文件用的是短横线来表示,然后目录文件呢,用的是 d, 链接文件呢用的是 l, 快 设备呢,用的是 b 啊,快设备用的 b, 然后制服设备用的是 c, 然后如果是 socket 这种,用的是 s socket 文件,如果是管道文件呢,用的是 p 啊,这是它支持的常见的文件类型啊,那 我们可以待会一会呢,我们可以登录我帮图系统,我们来看一下啊,他这些文件啊,这些常用的这些文件类型的标识啊,那除了用这些常用的文件类型的标识来标 区分不同的这种文件啊,那么另外他还有他自己的文件属性,他还可以通过颜色来标识不同类型的一些文件啊,比如说蓝色,它表示目录, 绿色呢,它表示可执行文件,就是绿色,浅绿色呢就表示链接文件,红色就是压缩文件,灰色呢表示其他 啊。当然这个文件类型和文件属性呢,不同版本的或者说不同的 linux 系统,它是不一样的,也就说在 read hat 里面和无帮图里面,这两块的内容是 不完全相同,有的是一样,有的是不一样的。那只要根据不同的这个系统,你要去看他的这个帮助文档,对吧?来了解他的这个文件类型和文件属性啊。好,那么我们来看一下,那现在我们就来登录一下我们的这个文件系统, 我们打打开我们的虚拟机,我们启动一下,我们进去看一下。 好,正在启动啊,稍微等待一下, 好,进来了会要求我们输入密码,我们输入我们安装配置时候给的一个用户名和密码, 他会首先进入到这个图形界面,我们从这个图形界面呢切换到我们的命令窗口来看一下啊,这是图形界面的登录,对吧?这一块我们也要会啊,怎么登录?那我们从图形界面 ctrl alt 加 f 二, 我们进入到命令,命令,你看命令情况下,他会也要求你首先要 log in 登录,那我们输入我们在安装配置它的时候,我们给的用户名,我是给的 w j。 好,然后我就说他要输密码, w g 密码它是不会显示的, ok, 进来了,进来以后你看它会显示提示 f d l, 巴西有,对吧?那这个时候我们可以这个怎么来看呢?啊?那么我们可以用 p w d 这个命名呢?可以看到当前我们的目录 是在 hold 下,这个就是我们的用户主目录啊,用户主目录,然后呢,我们在用户主目录下,我们可以用 ls, ls 这个命令呢,有点相当于我们 windows 那 个 dos 下面的那个 d r, 就是 列出当前目录下面的文件,你看这是我的主目录,你看这就有蓝色的,看到了吗?这些蓝色的就是文件夹。 好,那如果我想看一下它的标识呢?我可以加一个 l l s, 里面有一个选项 l, 它就会以长格式的方式列出,后面我们会详细讲,你可以看到这些蓝色的文件,而且它的你可以看到在它的第一个, 这个鼠标不太管用。哈,我们看到这个长格式的第一个啊,每一行的第一个字母,你看蓝色的,它标识的是不是 d? 第一点是什么?刚才我们说了目录文件对吧?而普通文件呢?你看他是杠,对吧?好,那么如果我们还想多看一些呢,我们可以将我们的目录改到我们的根目录传到,你看一下,这个上面有很多文件,你看 我们可以以长格斯的方式再练一下,你看这些浅蓝色的这种啊,或者是浅绿色的这种,你看它的前面第一个字母都是什么?都是 l, 对 吧?都是 l 啊,都是 l 啊,你看它都是 l, 看到了吗? l, 对 吧?就表示它是链接文件,你看指向某一个链接啊,而蓝色呢,就是目录,对吧?那如果我们再进到, 我们再进到一个目录下,根目录下面的 b, 我 们再来看一下,你看它这个里面就有很多什么文件, 绿色的看,有绿色的这些,对吧?绿色的就是可执行文件,也有很多链接文件,而且还有什么红色背景的,对吧?我们可以用还是用这个长格式的方式进来看一下, 看一下,你看这些绿色,对吧?啊?红色还有链接红色背景啊, 然后我们再来,当然还有很多其他的了啊,所以说在这里头我们要学会用 ls 这个命令和 ls 杠 l 这个命令啊。嗯,我们看一下,这是另一下面的。

欢迎大家收看二零二六年全新制作的切入式开发系统教程。为了制作这套课程,我不仅翻遍了 b 站几乎所有的课程,甚至还去 youtube 观看国外的老师做的切入式开发教学视频。 总结下来,我发现百分之九十以上的视频都整的鱼龙混杂,滥竽充数,而且很少有一步步带着你一起做,并且详细讲解单片机实战的教程。所以我决定摒弃所有花里胡哨,用最原始、最直观、最纯真的方式呈现出来,能让大家 最直接、最快速的吸收,并且最大程度上的活学活用。所以我综合了切入式的所有知识点,用更有趣味性的课堂表述,加上知识和实操相结合的实际案例,十三个月终于做出了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识。 我们这套课程呢,会从基础篇、境界篇和项目实战篇等三大方面来讲解。第一阶段基础篇包括了 c 语言、 linux 操作系统、数据结构与算法、 linux 操作命令和算法的编程与实现。接下来是嵌入式应用的学习片,你将掌握 linux 文件、 r u 标准用 法、并发程序设计和网络编程实战等,用最易懂的方式带你入门。嵌入式开发学习提升篇学习 c 家家面向对象编程以及 u t 侵入式图形开发,并结合当下热门的音视频开发和 open 七 v 实战,逐步学习 a r n 体系结构和接口技术。系统移植、侵入式内核驱动开发全套,从而帮助我们更有效的进行故障排查和错误调试,使用内核日制调试工具和跟踪技术来定位问题, 提高驱动程序的质量和可能性。我还会提供整套课程相对应的思维导图,让大家不用来不及记笔记而烦恼。实战篇会手把手带着大家练习企业级的落地项目,比如智能工业分解系统、智能交通系统、智能机器人系统、 互联网智能家居系统等等,从而帮助大家更好的应对人工智能时代的挑战。最后呢,会给大家一个小福利,课程视频中的所有素材 有搭建嵌入式开发环境工具包,还有嵌入式学习路线图,几十上百集素材,电子书学习课间面试题和项目实战等等,只要你能想到的素材我这里几乎都有,评论留言六六六 即可全部免费打包带走。相信我,这套嵌入式系统教程将会是全网最齐全最懂的小白专用课。如果看到这里对你有所帮助的话,请给 up 主免费的一键三连吧,让更多想要学习嵌入式开发的小伙伴都能看到这个视频。 hello, 大家好,欢迎来到沁州市零基础课堂,我是乐游,那么从本节课开始,我们就正式开始沁州市的学习了,那在沁州市当中呢, c 语言的作用可谓是直观重要的啊,所以我们将会从 c 语言进行学习。 那对于有些小伙伴来讲的话啊,我们去学习一门新的编程语言,那肯定不能只学习他的皮毛吗?对不对啊,特别是我们这种 c 语言偏底层的语言。所以我们在学习 c 语言的时候呢,我们要去学习他底层的这一个逻辑和一些实现原理, 那这样子的话呢,其实会更好的帮助我们去理解他的一些运行,以及在后续的学习当中啊,我们对于硬件操作能够起到帮助, 对吧?啊,所以我们学习社语言会从底层去带大家一起学习。十卷 n copy 就 出现了。十卷 n copy 的 作用是什么呢?十卷 n copy 的 作用就是去指定哎, n 个字节我只拷贝这么多,对吧? 啊,注意它是字节啊,它不是数组的这个元素数量,它是字节数啊,比如说 int 类型的话是四个字节为一个 int 类型嘛,对不对啊?那么你如果十个的话就是四十个啊,这样的一个过程,我们计算的时候一定要以字节去计算啊 啊,读出来的会补零啊,这个是注意事项,大家可以了解啊,到时候老师就认识求知不穿的长度啊,他是遇到反向杠零结束啊,就不包含反向杠零以及反向杠零后面的数据, 对吧?啊?比如说这里的实训十啊,然后全部都是零,那么你去实训认识他的话呢,他的结果就是零啊,就零 就没有就没有长度嘛,对不对啊?但这是拷贝的,还有什么呢?还有拼接的啊,拼接就是把原兽师的这个字母串啊,给他拼接到我们的目标字母串的后面,哎,后面怎么去定义呢?就是以反斜杠零的那个位置开始去进行拼接啊,他会把反斜杠零替换为 原字母串的第一个字母,然后以此类推哎,给它拼接上去。呃吧。啊,同样也包含一个时俊 ncat 的 一个字母啊,当然还有什么呢?还有时俊 c m p 和时俊 n c m p compare 嘛, 对比啊,就是我们要比较两个字母串,你自己去写 f 循环对比的话很麻烦啊,所以它有一个 compare 的 这样一个函数可以提供给我们去使用啊,我们直接调用就可以了,当然函数现在我们可能还没接触到,对吧,我们下一节课就会去学习函数了啊, 这里我们先知道啊,先了解它有这么多一些函数提供给我们去使用,我们在下一节课的时候呢,我们会带着大家一起去使用这些函数。各位, 哈喽,大家好,欢迎来到沁州市零基础课堂,我是乐游。好,那么其实,呃,经过前面几节课的学习呢,我相信大家已经把自己的这一个计算程序已经优化的比较好了,对不对啊?我们可以去进行一个呃,多位数的一个计算对不对?哎,但是呢, 虽然我们可以去进行多位数的计算了,但如果说啊,你像我们这个程序哎呦,把它搬过来再写啊, 我们这个程序的话呢,它是从外函数从上往下我们去编写的这样一个程序逻辑对不对啊?那这一堆东西呢,都是用来做一个数据运算的,那如果说我想在这个下面我再去进行一个数据运算的话,那我是不是又得把这一个东西哎给他 放到这里来对,复制一份吗?那这样的话就会显得我们整个程序很臃肿,档案码呢,有很多重复的地方,这个重复的东西呢,他明明可以不重复的,但是我们把它重复了对不对啊?这个在我们开发过程当中呢,叫做熔鱼啊,熔鱼就是重复了吗?对不对?重复的东西太多了, 好了,我们能不能去解决这一个重复性的一个东西,对不对啊?比如说这里是运算数据的啊,运算我这一个数据的一个结果的,那我只想要这一堆东西, 那这一种东西,然后呢?我运算的时候呢,我就去使用它,我不运算的时候呢,我就放在那边就可以了,对不对啊?同时呢,它在整个慢函数里面呢,它也不会说显得很杂很乱,对不对?我把它搞到一个,搞到一块去,对吧?啊?最后它只要返回一个结果给我,或者提供一个结果给我了,对不对啊?这样子是不是就 ok 一 点, 对吧?好,那编程语言,也就是我们 c 语言啦,或者说很多的这种编写 编辑程序的语言,他们为了能够去避免这种重复的劳动力,也就是我重复的去写相同的代码,对不对啊?所以呢,他就干嘛呢?他就引入了一个叫做函数的概念,那么函数呢?也就是我们本节课需要学习的一个重点内容。 函数啊,我们叫功能模块啊,功能模块 function, 在 c 语言当中的话呢,这个函数它其实就是完成某个特定功能的一个子类序集的集合的封装啊,可能这个这句话比较专业性啊,什么叫子类序集的这一个集合封装呢?首先每一 条语句啊,我们这里每一条代码,每一条语句,它其实就是一条指令啊,它去操作我们系统的一个 cpu 或者内存的,对不对啊?它是一条指令,那么多条指令在一起呢?它其实就是一个集合嘛,对不对?我们从上往下这些指令按顺序去执行,它可以完成某个功能的话呢,它就是一个指令续集, 那我就把这一些指定续集集合呢?我给它放到一块去,对不对?我们这里是放到了 main 这个函数里面,对不对?好,那我们放到一块,我放到我 main 函数,它是一个主程序啊,它是一个主函数, 是所有的程序都要从慢函数开始执行,对不对?那我不可能把这一些内容丢到慢函数,丢到这个主函数里面啊?我能不能放到另外一个地方呢?对不对?好,那么这个函数就起到了这么一个作用,就是我们可以把我们这一堆计算数据的这一些指令续集啊,把它封装到另外一个函数里面去, 所以函数的作用呢,就是把我们的指令续集做一个封装,做一个整合,对啊,整合完了之后我们去使用这个函数呢,哎,他就能够去执行那个里面的这些指令,对吧?然后呢完成我们需要完成的功能。 所以说函数的作用其实就是干什么的?函数的作用就是实现代码的一个复用啊,符合我们程序开发的这一个高内聚低偶合的一个 要求啊?什么叫高内聚,对吧?啊?我们的更多的功能它是比较内聚的,比较集合的低偶合的话呢,就是功能与功能之间他们不会有太多的关联,就是每一个功能它独立开来的话,也可以独立运行,对不对?他们不需要有太多的这一个偶合在里面啊?这个是我们程序设计的一个 要求,或者说一个规则,对不对啊?第二个的话呢,就是可以实现模块化的设计,什么叫模块化的设计啊?正如同我们去拼图对吧?啊?大家应该对乐高应该有个了解,乐高是不是有什么电机模块呀,轮子模块呀,啊什么等等其他的一些模块,对不对啊?如果有玩过的同学应该知道啊, 那这个模块的话是不是能够更方便?比如说我们想用乐购去组成,组成一辆,组装一辆车子,是不是可以用一个电机模块加轮子模块啊?加一些这种东西拼成一个车的形体啊,或者说框架,我们就可以让这个车跑起来, 对,那不需要你什么呢?不需要你去手搓电机啊,手搓轮子这些东西对不对啊?你手搓电机那就从零开始了嘛。所以模块化设计其实就是把一些功能性的东西,我们把它整合到一起,在需要的时候去使用,对吧?所以第三个 它的优势就是啊,它的作用就是它可以进行灵活的组合调用,就跟我们拼图一样,是吧? 那如何去进行一个函数的使用,或者是如何把我们指定续集的这个集合封装到函数里面去了,那就涉及到了我们啊,我们函数的一个定义实现,当然 在正式我们去学习函数的定义实现之前呢,我们得需要去知道,或者说我们得要去学习一下函数它的设计要符合一些什么东西,或者说我们如何才能够去设计好一个函数,对不对?首先呢我们在设计一个函数,设计这样一个模块函数的时候呢,我们首先要去分析一下它的需求, 就是我们先要知道我们去设计这个函数,或者说去设计这个模块,它是用来干什么的,对不对?那我要完成这个模块,或者说我这个模块从开始运作到最后它的功能实现,它应该要我提供一些什么东西,对不对?是吧? 比如说我们的电机,电机模块的话是不是需要我们提供电源,所以他就会留两根导线出来吗?对,这个就是需要的资源。我们函数也是一样的啊,你需要实现这个功能,那么你就要留一些东西出来啊,你需要我提供的一些东西出来,对不对啊?这个我们称之为资源,可以是数据,可以是内存空间,可以是一些其他的东西。 对啊,第二个我们需要去考虑的是就是函数的功能实现啊,这个玩意我们叫算法,就是如何去实现这个函数,比如说我们去实现这一个计算的函数,对不对啊?计算的这个模块,那我怎么去实现这个计算的模块呢?对不对 啊?我想要考虑到多位数的运算,所以我会用到数组,我想要考虑到重复的运算,我是不是要考虑到这一个 while 循环或者 for 循环来让它支持这个重复运算,对吧? 那么啊,我要考虑到这一个数据的一个累加或者累减,我还要去判断这一些运算符的操作,对吧?那这个呢,就是我们函数的一个功能具体实现的方式。那最后一个点呢?就是需不需要反馈一个结果? 我这个函数啊,计算数据之合或者是计算数据的一个结果的,那最终是不是要把这个计算完的结果给到我们, 对,那这个就是我们需要返回的一个结果呀,像电机模块,你我提供了电源,那么电机他就会返回一个扭矩给我,或者说返回一个这个电机会转起来吗?对不对?他那个转的那个上面是不是会有旋转的扭矩?对,那这个扭矩就是我需要的这个力吗?他就给到了我一个这样的结果,不对,他会转起来就是一个结果 啊。所以我们再去做函数的一个设计的时候,我们就要考虑这一些点啊,就是,呃,我要完成什么东西,要什么资源,对不对?我怎么去实现?最后需不需要有结果的反馈,对不对? ok, 那 知道了这些之后呢,我们就可以开始来我们的实现我们的函数的一个定义了。首先呢,呃,这一个函数的话呢,它的一个定义语法啊,我们可以先来了解一下。首先呢函数它是分为这一个函数头 啊,函数头其实就是跟我最开始跟大家介绍啊,我们第一个程序是一样的啊, int main, 它其实也是一个函数嘛,对不对?那 int 的 话我讲过是一个返回值类型,对吧?啊?那么在我们自己设计的函数里面呢,也需要返回值类型,可以是什么呢啊?可以是任意合法的这一个 c 元的类型, 对吧?任意合法的 c 语言类型啊,它一般是 return 后面的那一个数据的类型,就是 return 后面那个数据的类型,要跟我们函数名前面的这个返回值类型要一致啊。如果你返回的是整形,那么我的这一个函数名前面的这个类型应该是 int 类型或者是 short 类型这样子的整形对不对? 然后后面是函数名,函数名是什么呢?它是类似于变量名、数组名一样的东西,它也是一个标识符啊,作用的话呢是将这个名字和函数关联起来,这里要注意啊,函数呢?它其实本质上是什么呢?本质上它其实就是一个内存执行的一个地址, 我们指令它也是存储在内层里面的啊,我们可以画个图给大家稍微讲解一下这个底层的原理啊。就是,呃,比如说我们的微函数,这是微函数对不对啊?哎? 哦, main 函数,那么 main 函数呢?它会有在内存当中去执行的时候,它会有一个地址分配给它啊?我们假设叫零 x e f 的 这样一个地址,那假设我们分成了另外一个函数,对不对啊?我们另外一个函数叫什么呢?假设叫做这一个。呃, my function, 好 吧。啊? my function 啊, my function 这样一个函数,好,这个函数呢?它是另外一个地址了啊?零 x, 比如说 e d 啊,或者说,呃, f f 的 这样一个地址, ok 啊,随便写的。 那也就说慢函数它在执行的时候呢,它会从 e、 f 的 地址一直往下执行每一条指令呢?其实就是一个地址,每一条指令就是一个地址,所以一你这个里面有多少条指令,它其实就会按顺序往下执行到这个地址来,对不对?好,那如果说我想要去执行 my function 这个函数的话怎么办?那我是不是就把这个地址给它插进来就可以了, 对不对?插到我慢函数,或者说我想要使用这一个函数这个模块的一个位置就可以了,对不对啊?也就是说 只要把他的地址插进来,那这个我比如说我们插到函数里面来,那函数从上往下执行的时候,哎,他遇到了这个零、 x、 e、 f、 f 的 地址,他是不是也会去执行这个函数里面的内容? 对,他是一个这样子的过程嘛,跳到这里来执行啊,所以他本质上是个地址,那这个地址怎么拿得到呢?哎,就是通过函数名去拿到的,函数名他就绑定了这样一个地址啊,他跟函数关联起来了的 o 吧。好,然后里面呢有一个括号,后面紧跟的是一个括号,括号里面是行差链表,行差链表呢,是指我们这个函数这个模块在运行在直线的过程当中,它需要我们外部去提供一些什么资源,对吧?像那个电机一样,我们外部要提供一个什么电源吗? 对不对啊?由我们外部的一个使用这个模块的人,或者说使用模块的。呃,这个函数去提供 o 吧。好, 那函数体呢?是花括号括起来的啊,就跟我们函数一样括起来的。这个里面呢可以写什么定啊,类型的定义啊、负循环啊等等七里八里的一些代码啊,这些代码呢都是为了去实现我们这个函数需要实现的功能,比如说我们想要去计算数据值和对不对,那我们就可以把我们之前的代码给他放到这个函数里面来就可以了。 好吧,所以一个函数的写法其实就是由函数头加函数体组成的,那么函数头就是由返回值、类型加函数名加行长列表对组成函数体呢就由花括号加函数的具体实现步骤来组成的,他们两个加起来就形成了一个 这个标准的函数,或者说一个函数的一个,呃形式好吧好,最后呢这里面有一个返回值啊,返回值类型的话,呃这里面有写啊,当然也可以没有好不好也可以没有。那有跟没有怎么他其实是有区别的,有两种写法,我们等一下来再具体去实现函数的时候我再跟大家去讲, ok 吧。 ok 呃我们来看一下啊。啊那数据的话呢?呃格式啊,就是行参列表啊,我们其实可以不写啊,当然也可以写 void 啊,其实之前跟大家讲过有 void 就是 空类型对不对?它作为函数的一个参数来使用的话呢它就表示没有啊,没有参数。那你不写其实也是没有参数吗? 对不对啊?不写也是没有参数,那如果有参数怎么去传呢?就是数据类型一啊,加数据名一然后逗号 啊,就这样子啊,数据类型二加数据名二啊,都好,就是类似于一个变量的定义一样, ok 吧啊它可以有不同类型都是可以写到上面的啊,它是个列表行差好不好?好了我们怎么去定义一个函数啊?比如说我们拿 m 函数做例子的话呢? m 函数它的原型长什么样呢?它是长这样子的啊, 叫啊 int main 啊, int a r g c 啊,逗号 const 叉二星 a r g v 的 一个叫什么?一个方括号啊,其实后面是一个数值对不对啊?它其实 main 函数的这一个原型函数啊,就是它长得原来的最开始的样子就是这样子的啊,带两个参数,一个类 int 类型的参数,一个叉二星类型的数值, 对不对?那里面就是我们要写的东西了吗?对不对啊?我们要写的东西。 ok, 好, 那这个东西比如说我们要去实现我们自己的一个函数的话啊,假如说我们这里要实现我们自己的这一个计算函数啊,计算的一个函数对不对?哎,我们来看一下啊。呃呃,计算函数对吧? 好,把我们之前的我们写的那一个计算的代码给它搬过来,我们的代码是这样子对不对?我们现在要封装一个函数,我们怎么去封装呢?哎,我们是不是计算函数我们把它拿过来啊?计算函数,那么它需要参数吗?肯定需要参数,对不对啊?参数 ok, 参数呢?是,呃需要计算的这一个操作数对吧?需要计算的操作数。那有没有返回值?当然有了,返回值呢就是计算之后的这一个结果 对不对?好, ok, 那 我们来定一下啊,那计算之后的结果我我们的结果一般都是整形对不对?这里都是整形,所以我就用整形。好,然后啊 cardalay 呃卡卡卡口,哎,算了,我不记得了啊。 c h c ok, 可以 了。 c l c l c 啊,就这样一个名字。 好,然后它要有行参,我们的参数就是行参嘛,所以第一个啊叫做 sum 一 int 一个 sum 二就可以了。好,那有没有结果呢?结果肯定有了, sum 类型对不对啊?等于一个零。 ok, 那 我返回,返回谁呢?返回 sum 啊,就是返回计算的这一个结果,对不对? 好,那这里其实还有一个问题啊,就我们要计算的话,你你你一跟二要计算它到底是加还是减,我们是不是也要有一个,对不对啊?所以我们把这个 char 类型的,呃,这个 expr 啊,操作数啊,以及这一个操作符,我们给它搞进来, 对,好,那怎么去计算嘛?那 sum 等于什么?等于 long 一 欸?直接 expr long 二吗?这肯定是不行的,对不对?它不能直接放进来,所以还是需要什么呢? switch 我 们要来判断一下。 判断什么东西呢?判断这个 expr 啊,它到底是加还是减,对不对啊? cash 我 们的加啊,然后呢?我们的 sum 就 等于 sum 一 加上 sum 二啊, break 掉 就可以了,对不对啊?然后 sum 如果是减号的话,我们是不是就是 sum 等于 sum 一 减去 sum 二就可以了啊?同样 break, 那也就是说在这个里面他就会不断的去进行计算了,他只会去计算两个操作数,对不对?但是我们这里,你看我们这里是什么?我们这个数据他是要不断的,干嘛?他要不断的去, 呃,叫啥来的?不断的去获取我们的这一个数据啊,然后去计算他是多位数的吗?对不对啊?那这里的话呢,我们稍微修改一下, ok, 稍微修改一下,嗯,我们直接来啊,把它删掉。 int 一个 number 一 啊,等于零啊, int 一个 number 二等于零,对吧啊? scale 我 们的这个百分号 d 啊,然后百分号 c 啊,百分号 d, ok, 这样子。取整数符 number 一。 呃,取整数符 xpr, 我 还没定义啊,等下定一下啊。呃,取整数符 number 二,对,好,搞定我们就可以输入了嘛?对啊, char xpr 等于一个零, ok, 好, 我们数据已经输入完了啊,我们的这个计算函数也搞定了,对不对?那么我们怎么去使用它呢?那这涉及到了什么?涉及到了我们函数的一个调用的方式。函数调用呢,很简单啊,它呢? 首先啊,语法可以,为什么呢?哎,括号还是一样可以省略的部分啊,返回值类型变量名等于。哎,那这是什么? 既然是数据类型加变量名,它其实就是定义一个变量吗?也就是说如果我们的函数有返回数据的话,你需要接收到它的返回数据的话,你可以定义一个与函数返回值类型一致的变量来接收它的结果,对不对啊?那真正的调用是怎么调用呢?就是函数名加时长列表就可以了, 这里时差列表是什么?时差列表?注意它和行差列表是一一对应的,如果你的行差是 int a, int b 跟恰 c 的 话,那你实际参数在传递的时候就是时差就是实际参数啊,实际在传递的时候呢,就是要传递一个整形,两个整形和一个制服型。 对,它只要类型相似就可以了。它不需要,不需要我们写类型加变量名的啊,只要这个变量它的类型跟行差的类型一致就 ok 了。 好吧,那就比如说,呃,我们这里要调用啊, int 一个 sum 等于,或者说啊 resolute 啊, resolute 等于什么呢?等于啊, coco coco 啊,我们来一个啊,十十和一个加号,那其实就什么计算十和十的合并 存储啊,将其结果存储到 resolute 变量中,对不对?就这么一个过程嘛。好吧,这个就是函数的调用,所以在这个里面我们可以干嘛?我们直接就是啊,呃, into resolute 等于 coco, 对 吧?啊?朗一传进去,朗二传进去和一个 expr 传进去,最后啊,我们打印一下,结果啊,打印下结果,我们的这一个百分号 d 啊, 呃,百分号 c, 百分号 d 等于百分号 d 啊,我们给它写的好看一点,对不对啊?朗一, expr, 朗二和 resolute, 我 们的结果 对不对?好,这样一个结果, ok, 我 们来看啊, g c, c 整理啊,然后翻译一下啊,等一下啊,好,翻译完成。点干 a 点 ex, 一 加二等于三, 对不对?那我任何地方我都想要计算的时候,我不需要重新去写这个里面的代码了,我只需要干嘛?我只需要去使用这个 code 啊,对吧?然后把参数传进去就可以了嘛,对不对?是不是很简单? 很简单吧,那这个呢,就是我们一个自定义的函数啊,但是在这个函数里面啊,大家要注意啊,这个函数里面呢?呃,我们一般把 在这个里面啊,你看这这一行号呢,我们一般在这种情况下,我们分为这个慢函数跟 coco 函数呢,我们有一个区分的啊,慢函数呢,称为主调函数, coco 函数呢?我们称为什么?称为背调函数,那为什么?呃,慢函数称为主调函数, coco 函数称为背调函数呢?是因为 我们的这一个,哎,往下面写一点啊,我们的这一个主调函数呢,其实就是在别的在调用其他函数的这个函数,它就是称为其他函数的主调函数就是 main 函数。调用了谁呢?调用了我们的 coco 这个函数,对,而 coco 呢,它是被我们的 main 函数调用的,所以 coco 它是什么? 它是称之为背调函数啊,它是内函数的背调函数,而内函数呢,是 coco 的 主调函数,所以主背调函数,我们要知道,好吧,我们要区分谁是主调函数,谁是背调函数, 好吧,谁是主调函数,谁是背号背调函数。好,那么为什么?既然我们搞清楚这个东西了,让我们再来思考一下,为什么这个 coco 它可以去计算 number 一 跟 number 二的这个数据,对不对?那 这个的话呢,就涉及到了我们函数它的一个调用过程啊,你可以来看一下,比如这是 main 函数,对不对啊?这是我们的 coco 函数 main 函数啊, coco 函数好, coco 函数需要一个 int 类型啊,然后再需要一个 int 类型啊,以及一个 char 类型,对不对? 而麦芽素在这里调用了 coco 函数啊,它传了一个什么东西呢啊?传了一个,呃, number 一, 对啊,这个 number 二和一个 expr 进去了,对不对啊?那也就是说,在这个传递的过程当中呢,它会把 number 一 的值给到 coco 里面所对应的这一个 行差,那么二呢?同样给到这个行差, expr 也给到这个行差。好,那我们这里那么的值是多少?是一,那么二是二啊,然后 expr 呢?是加,对不对?所以这里过来的时候呢,它就相当于把一给到这里的那么一了, 对啊,把这二呢给到这里的那么二了, expr 给到这里的 expr 了, 对不对?好,那为什么可以给?是因为啊,回到我们代码这里来看一下啊,这里的 int num 一 呢,它是类似于变量定义,也就是说当这一行代码执行的时候呢, 我们 calculation 就 开始执行,就开始运行了,对不对?那运行的过程当中,它先会把 num 一 的空间去申请, num 二的空间申请, e x p r 的 空间申请,对不对?这里就相当于进行了三次的变量定义,定义完了之后呢,再把 number 一 number 二跟 e x p r 这个里面的值呢,给它拿出来复制给它们。所以总的来讲啊,它其实就相当于一个什么样的过程呢?哎,等一下啊, 就相当于是 man 里面它有一个啊 number 一, 对不对?往下面写一点啊?看不清啊, man 里面是不是有一个呃, number 一 的数据? 而我的这一个啊,卡口里面它是不是也有一个纳米级?它就等于什么呢?等于我们的这一个呃, man 的 纳米级,它做了一个这样类似于一个这样子的操作啊,我们可以这样子去看待它啊,会比较好理解一点,对不对啊?它做了一个类似于这样子的操作, e x p r, 所以 我们卡口里面它才能接触到这一个类似于这样子的操作, e x p r, 所以 我们卡口里面它才能接触到这一个类似于这样子的操作。欧巴 好,那么拿到这些东西了,他是不是就可以去进行一个运算了?所以他整个的一个调研过程呢,就是先会把时差的值赋值给行差,然后呢去执行背调函数中的语句代码, 那背调函数返回的时候呢,函数的表达式的值就为 return, 后面的表达式的值就是函数结束了啊,这个函数他到这里就结束了,对不对?那么这此时这一个表达式,我们称之为表达式嘛,对不对?这个表达式肯定会有一个值的,他一个结果的结果就是他里面这个 return 里面的值。 好吧,那这个值我是不是就可以获取到这个?呃,一加二,或者说这个辣米一加辣妈,辣米一减辣妈的一个结果,然后复制给 resolute 了,对不对?就这样一个过程嘛, 这是整个函数的一个调用过程,当然它前面还有细化的啊,就是要先去把行参的空间开辟出来啊。好,那么函数它的数据传递呢?我们刚也看到了啊,我们可以通过参数传参的时候呢,我们可以通过实际参数和形式参数进行传递。 那背调函数与主函数传递参数的话呢?啊?我背调函数怎么传递参数给主函数?传递数据给主函数通过返回值嘛? 当然主调函数与背调函数想要相互传递参数啊,那我们可以通过指征或者是全矩阵,那这两个东西呢?我们后面也会再去学习的, ok 吧? 啊?我们现在只知道啊,现在知道啊,这个主调函数与背调函数相互传递,可以通过指征与变量,当然主调函数往背调函数传递了,我们可以通过传参,对不对?背调函数与主调函数传这个传递参数的话呢?我传递数据的话,我们可以通过返回值,对不对?啊?三种东西,好吧, 好,那知道了这一些内容之后呢,我们再来看一下啊,大家可以发现我的这个函数是写在哪里的?写在主函数的上面,对不对?那大家都说,欧巴我之前跟大家讲过我们的这个执行顺序从上往下执行吗?对不对?那他为什么不会先执行?他可而会先执行妹呢? 啊?因为面是第一个函数啊,就是面。呃,这个程序里面的一个入口函数,相当于大门一样,他会先从这里来进,好不好?那有的人说我可不可以把这个函数写到后面?这个函数你可以写到后面。没关系啊,这个函数可以写到后面。可以的 啊。可以。但是呢,嗯,有的时候会出现一些问题啊,我们可以看一下。这个时候他就出现一些问题了。什么问题呢?他他告诉我们啊,这一个, 呃。 function call, 对 吧?它其实是找不到啊,就说说人话。就是啊,我找不到这个参数啊,我找不到这个函数,你这个函数去哪里了,对不对?哎,但我这个函数在这里啊。这卡口不是在这里吗?为什么它找不到呢? 啊?因为我们程序它虽然是从慢函数开始执行,走上往下执行的,对不对?但是还有一个翻译的过程啊, g c c。 它有一个翻译的过程, 他翻译了就是从上往下执行的,他没有不会说从慢函数开始执行的,他会从上往下执行,从上往下执行,他就会遇到一个叫做 coco 的 函数。哎,我没见过这个函数。没有啊,你没告诉我这个函数啊,那 没有这个函数不就报错了吗?对不对啊?所以他就报错,他不让我们翻译成功啊。那为什么写在上面可以?因为从上往下执行的时候,我们的 coco 函数它在上面,它一开始就被这个编辑器发现了, 但是这个函数呢?没有做其他的事情,它只是声明啊,我们就定义了这样一个函数,对不对?没有去用它,那到了 main 函数的时候发现,哎,我 main 函数里面调用了 coco, 那 coco 我 在上面已经看到过它了,所以它就不会报错。 ok, 那 我只能把函数写在上面吗?当然不是的啊,如果说我们把函数想要写在下面的话呢?我们要进行一个操作,什么操作呢?叫做函数的一个声明。 去提前告诉我们编辑器有这么一个函数啊,你不要报错,你见到了这个函数的调用,你先不要报数了,我的函数的声明可能在后面,对不对? 好吧,也就是说当背调函数在主调函数的后面的时候,我们就要去声明,好吧,或者说在其他文件的时候啊,声明怎么声明啊?非常简单,就是把它的函数头拿出来啊,加个分号就可以了。写在最前面啊,也就是我们代码这里把这一节给他复制啊,丢到最前面了。这个就是声明函数 声明了一个啊,返回值为 int 类型,且带有啊两个 int 类型和一个 char 类型的 类型参数的函数啊,就声明嘛,就告诉,提前告诉嘛。那这种情况你申明了之后呢,你会发现你再去翻译它,它就不会报错了,同样啊,它可以正常的执行,对不对? 好吧,这个就是函数的一个声明。好吧,那只不过了声明的时候有一个小小的啊点,就是我们可以把他的名字给他省略掉,就是变量的名字,这个名字可以不写啊,你只要告诉他类型就可以了。因为为什么可以不写?因为你在定义的时候你已经给了他名字了, 你在定义的时候给了他名字了,你声明的时候其实不需要改名字,你只需要改什么呢?只需要告诉类型就可以了。为什么类型一定要名字不要啊?名字刚刚讲了为什么不要?类型一定要的原因就是系统他必须要知道你这个函数他要不要行差嘛,对吧?行差是什么类型他才能够计算你这个函数需要在 一开始的时候我就给你的这个行餐分配多大的空间吗?对不对?我要告诉或者别人在调用的时候,我可以通过你的类型去判断他有没有调用出错吗?对吧?这个就是类型必须要写的一个原因。好吧, 那我们学习完这个之后呢,可能就有同学会有一些疑问了。啊?什么疑问?老师,这个返回值我有点搞不清这个返回值它到底返回了一个什么东西,对不对?我这里知道啊,在计算的时候我们可以我们是返回了一个整形用来返回结果的,那其他时候呢?它返回什么东西,它表示什么意思呢? 那么这个的话呢,大家要注意了,返回值到底返回什么东西啊?返回的是什么?它取决于写代码的这个人,我写的这个程序,那么返回值由我来决定它是 干什么的,也就是说我觉得这个玩意它应该要返回什么,它就返回什么,那最终返回值的结果所能表达的含义的,那解释权归我们程序开发者所有啊,好吧, ok 吧。 啊,同时啊,要注意的就是一个程序里面的卖还是只能有一个啊?因为他是大门啊,你们家大门一般都大,每每个人家里大门只有一个吧,对不对?不可能有多个大门嘛,对不对?但是其他的函数的可以有零个或者多个,也就是你家除了大门之外啊,你其他的那一些室内门你可以有也可以没有, 对不对?这个是没关系,只是大门必须要有一个好吧?啊?有且只能有一个, ok, 好, 这个是我们的一个函数啊, 函数的话他可以帮助我们去实现很多很多东西啊,可以去解决我们代码里面的一些这种逻辑混乱啊啊,然后代码重复的一些问题,对不对啊?可以让我们的整个程序的啊逻辑啊这些业务的一些呃代码的呃 功能啊等等都会变得更加清晰更加明亮,好吧。啊那么在函数里面呢有一个东西叫递归函数啊,递归函数的话呢?是呃比较特殊的一个函数。那递归函数它是什么样子的呢?就是我们在一个函数里面,比如说在 coco 里面, coco 里面它自己也可以调用 coco 了,对不对? coco 是 不是也可以自己调用 coco? coco, 好, 那么自己调用自己这种情况的话怎么办呢?哎,你看这里我 coco 调用了 coco, 那 又进到这里来了啊,那么又进来的时候又有 coco, 它又不断地进,不断地进,不断地进,哎,那是不是就不断地去调用自己了, 对不对?那就陷入了一个循环里面去了。那自己调用自己的这种函数他叫什么函数呢?就我们刚我刚跟大家讲了他叫递归函数,递进递归啊,自己调用自己的一个函数,或者说直接或者间接调用自己的函数都叫递归函数,好吧,那么递归函数 这个东西他能干什么对吧?他的优点是什么?为什么要搞一个这样的函数出来?为什么要单独把递归函数拿出来讲对吧?好,递归函数呢,他可以把复杂的问题简单化的去描述啊,当然 第一关函数他虽然是简单化描述,但是他不会降低整个程序的复杂度啊,他只会增加复杂度。好吧,这是第一点,第二点的话呢就是可以提高什么 big 啊。提高逼格写代码要写到别人看起来很高大上吗?对不对啊?这个提高逼格 那比如说像什么样子的呢?嗯我们要去呃做一个这种累加的程序的话,对吧? 啊累加的程序哎累加累加,比如说从一加到什么呢啊?我们要从一加到一百对不对啊?那怎么去写呢?如果说我们按照以前以往我们现在已经学完的这一个呃东西去写的话呢可能我们就会这样子去写了, 叫做呃 int a 等于零,然后呢?呃 for 循环啊, int i 等于一 g i 小 于等于一百,然后 i 加加对不对?然后这里面是什么? a 加等于 i 嘛?最后啊 print 我 们打印一下啊百分号 d a 的 值啊,这个累加对吧?是不是好运行一下五零五零是没问题的对吧?啊是没问题的好,那这个累加的话呢,可能嗯 大家都会写对吧?看起来也挺简单的。他除了能够用 for 循环去写的话,我们给他讲了我们可以用递归函数去写啊,但递归怎么去写呢?递归写之前啊我们还是一样要通过像函数的这一个设计一样,我们要去分求一下啊,去分析一下他的需求。首先他是递归啊,他是哪家,对不对?第二个的话呢?我们怎么去实现 啊?实线的过程我们其实就是要拆分。第一个函数呢,要考虑实线的过程,他跟正常的函数实线不一样啊,他要考虑拆分,他是去把问题给他拆分一下。比如说一啊要加到一百,那么我们是不是可以把它拆分成 什么呢?一加到九十九啊,再加一百的这个值,那一到九十九,我们是不是又可以拆分成一加到九十八啊?然后加上九十九的值, 对,以此类推。最后,最后,最后,最后我们是不是可以猜成什么呢?一加上二的结果,再加上三就是我们这一个地规,最开始的时候就是我们一加二的结果,加三才是我们的这一个前面三位数嘛。但再往下猜,可能就是,呃,这个零加一 啊,零加一加二的结果呢,就是我们前面两位数的和,对不对啊?以此类推。你是哎,你会发现整个一累加到一百,它可以拆分成很多个形式啊,或者说它可以一直往下拆,拆到最后就会变成零加一加二的一个形式,对不对?那递归呢?它其实就是利用了这样一个原理, 你会发现在这个里面,他其实无非就是,呃我的呃,一加到三的结果,等价于这一个三加上他前面数据之合,对不对啊?一加到一百的结果,其实无非就是一百加上前面数据之合嘛, 对吧?他可以看成一个这样子的,这一个呃,叫做问题,这个问题一加到一百的这个问题可以把它拆分成啊,一百加上前数据之合 对不对啊?就加变成两位数字两位数的一个运算方式了啊,我这里是一直往下加,对不对?好,那么地归怎么去加呢?呃,地归累加地。哎, 地归啊累加,那我们可以这样子去写啊,把这里给它干掉,好吧,然后呢?呃去写一个 enter and 好, and 是 什么呢? and 是 我们的这一个累加的一个函数啊,就是第一个函数啊,然后我们定一个 num, 它这个 num num 是 干什么用的呢? num 就是 你要计算的那个值,对不对啊?计算的那个值 ok, 那 么此时是,呃,比如说我们要算这个一百啊,我们要算一百 一累加到一百对不对?那么是不是我们刚才讲的才分成啊一加到一百啊,它其实等价于我们括号一加到九十九加一百的值对不对?所以假设这个 num 它是一百的话,那是不是就是 num 要加上 and 欸 long 减一的值,好,那这里的话 long 是 什么呢? long 等价一百而 long 减一是不是就是九十九? 对欸,那这样为什么这样子可以啊啊有同学问老师为什么这样子可以啊?那你想想看啊,我们 end 的 作用是什么? end 的 这个作用啊, end 呢?是求啊一累加到 long 的 值的一个 功能的。对啊,那那么是一百,那就相当于是一累加到一百,那那么减一变成九十九了,那是不是就是一累加到九十九那这不就变成了什么?就变成了我们在一个一加到九十九的结果加上一百吗?对不对? 好,那这里又调用了 and 那 这个时候传进来是多少。是九十九那就变成了九十九加九十一减加到九十八那九十八再往上那就变成了九十八等于啊这里应该是加等于啊加等于啊加等于我们的不是加的加。哎这搞错了 into 一个少了个东西啊 into 一个 sum 啊等于我们的 let 就变成了九十八啊加上我们的这个九十一累加到九十七的结果对不对啊最后我们这里干嘛呢我们就返回一个啊上不就可以了吗那有的人会说了啊你老师你这一直减下去不就减成负数了吗还有可能吗对不对啊肯定有这种可能。那怎么办呢我们要给他一个退出条件退出 条件如果你不给退出条件的话呢他就类似于一个死循环一样了对不对啊那你要等于什么呢等于我们的一的时候啊我们就返回一就可以了对不对那么等于一的时候我们就返回一 o 吧一一还要算吗这里不是二吗对不对啊二加上它返回结果是一啊二减一为一嘛对不对等于一了就返回回来就可以了所以我们这里同样啊应了上等于我们的这个 and 一 百的值我们去求一勒加到一百的结果。 print 啊百分号 d 上嗒看一下啊 啊地归类加啊走你五零五零是不是也是五零五零啊但如果说大家觉得呃这个玩意看起来我我觉得可能大家搞不清的逻辑对不对啊那怎么办我们可以把它打印一下吧哎浪等于多少 对不对 num 等于多少。好我们来看每一层它的 num 是 什么样子的, ok, 你 看一下啊,从第一次往最上面就是第一次,第一次进来,我们在主函数调用的这一个 num 之后,那 num 进来是不是一百好,然后就变成了一百加上 and 一 百减一,然后就 进,下一次进入了这个 and 就 变成九十九了,对不对?好,然后一直往下,一直往下,一直往下就变成一对,所以他其实就是把一到一百的值全部给他累加起来了,跟我们那个复循环有点相似啊,但是你会发现他这个,呃,他这个 结构其实会变得比较复杂的,把这个问题呢会给他简单了,就是原本是要一累加到一百,一百个数相加的,他变成了两个数相加,对不对?他变成了两个数相加了,对吧?这个就是我们的一个帝国函数啊,帝国函数,那么呃,帝国函数的设计啊,大家一定要注意啊,设计的话呢, 首先我们这个问题,模型要符合地归模型,就是他要地推对,像我们刚一累加到一百,他其实就是符合地归模型的嘛,就是我一累加了一百,一百个值相加的这个模型我可以变成两个数相加的一个模型,对不对 啊?第二点的话呢,就是要去明确函数要实现的功能和参数之间的关系。那我们这个代码里面,我们函数它在实现过程当中呢,它对于参数的要求是这样子的,就是我 第一次进来是一百,对不对?第二次了,他应当是这上一次调用的这个参数减一的一个参数,因为他们是一个递减的过程,对,递减的过程啊。第三个的话呢就是问题的解要递归到一定层次的时候,答案是显而易见的啊。什么意思呢? 就是我们要从一累加到一百,对不对?那你从一百要百一,一累加到一百要变成一百加上九十九加一的值,一直要往下推,推推推推,推到什么时候呢?推到二加一的结果就可以了,那这个结果就已经出来了嘛, 对不对?推到那母为一的时候,是不是就那母为二的时候,这个整个结果已经显而易见了?就最终他就变成了二加一的一个结果,对不对啊?那为一的时候就结束了吗?所以要有一个结束函数。所以呢啊,最后一点就是要呈现出第 n 层和第 n 减一层的第二环关系。 我们这里也是有的啊,比如说第一百层就是一百加上九十九加一的值,那第九十九层就变成了九十九加上九十八加加到累积到一的值,对不对啊?就这样一个过程。好吧, 好。那么递归的话呢,它其实除了,呃除了我们的这一个我们刚讲的这个递归方式之外啊,它其实大致分下来的话会有两种形式啊,就是先递归到最下层,然后一层一层的往上走啊 啊?一层一层的往上走,比如说我们这个二进字的一个组合,他要把一个数呢要拆打散才分成二进字啊?然后呢不断的往上去进行一个组合,对不对啊?你可以把它看成是什么呢?呃,我们一个比如说一个服务员啊,他去坐电梯, 对啊,他要给每一层呢都要去分发这一个,这个这个简餐,对吧?这个,嗯,要吃的东西。好,那他怎么去做呢?他首先跑到最上层啊,从最上面往下面跑 啊,跑到最上层啊,就我们可以看的是底啊,他最上面的,然后呢?嗯,一层一层一层的往下,干嘛?发这一个,呃,饭,对吧?发完他是不是就结束了? 从跑到最下面,然后一层一层的发啊?发这个配餐发完了他刚好就回到最底下了。这个就是先跑到最下面,然后再往上走,这个叫回数法啊,回数法 o 吧。好,然后第二种的话呢,我们叫分制法。分制法是什么呢?分制法其实就跟我刚刚所讲的这一个一类加到一百是一样的, 他会把一个问题分解成模规模更小的问题,我把一类加到一百,一百个值相加啊,变成了这个一两个数相加的一个规模, 对不对?你看啊,一类加到一百二变成了一百,加上一到九十九啊,然后九十九变成一加加到九十八啊,然后 n 加到 n, 一 加到 n 减一的和,然后三啊,就是一加二的和,对不对?就这样子不断的去拆解问题,不断的去拆解问题。上面这个回数法呢,是先跑到最下面再往上面走, 欧吧?这是这样的一个过程啊,两种方法啊,两种方法,大家反正根据场景去选择方法就可以了。好吧,根据场景去选择方法。 那么地规函数的这个数据传递的话呢,其实都是差不多的啊,跟函数函数函数的传递, 只不过它每一次地规处理的数据对象呢是不同的。这个数据对象的时候呢,我们可以把数据对象啊作为参数去传递,比如说 long 对 不对?那如果说每次地规处理的是同一个数据对象的时候呢,我们就可以使用全 g 变量啊,或者说指向啊,后面会讲到的。 然后再一个的话呢,就是我们把子问题解决了之后需要回解,就是你把我的解传回去的话啊,就我们类似于一加到一百的这个结果,对不对啊?他要回解吗?一加到二的值是不是要返回给第三层对不对?那么他就可以通过返回值去返回就可以了,好吧, 好, ok 啊,那么函数的话呢,它其实可以解决我们这一个程序里面啊,当我们程序的代码全部写在同一个函数的情况下面啊,造成的这一个逻辑啊复杂,或者说我们逻辑不清晰的情况下面呢?我们的函数啊可以让它变得更加清晰, 因为你像啊,如果说我们把很多的一些功能啊,很多的一些逻辑全部写到面函数里面啊,他就会显得很乱,对不对啊?很多 看起来不是很舒服,那我们就可以利用函数的这样一个机制呢,我们可以把我们一些单独的功能给他剔出来,放到函数里面去进行一个封装,对不对?那么呢我们整个程序就会变成了一个模块,两个模块啊, a 模块跟 b 模块的一个结合,对吧?啊?多模块的一个结合, 那这样子的话呢,就能够从整个就是代码上面啊,让我们看待这个程序的时候啊,我们的逻辑跟思路会变得更加清晰,对不对? 好,那么我们自己在写的过程当中呢,大家可能也会存呃,会遇到一个问题啊,就是用函数的时候会遇到一个问题,什么问题呢?就是我们会发现啊,在某一个函数里面,我们如果说, 呃定义了一个变量,那么在其他函数里面好像是没有办法直接使用的,对不对?比如说我在 sum 里面定义了一个 s 的 这样一个求和啊,或者说重合的一个变量,那么在 main 函数里面,我们没办法直接去打印这个 s, 对 吧?你不调用那个函数啊,你直接去打印 s 好 像是不行的,它会报错, 报什么呢?报找不到这一个变量的一个错误,对不对?那这是因为什么原因呢?这是我们在 c 语言里面,其实它规定了每一个变量都拥有一个自己的作用范围的。 好,那这个作用范围我们要怎么去确定?或者说我们怎么样才能知道一个变量它的作用范围是怎么样子的呢?对不对啊?那么我们接下来就来学习关于这一个变量的一个作用域与生存期。 那所谓的作用域呢,其实就是去表示啊,我们定义的一个变量,这个变量的名字,它能够作用在哪一些区域范围之内吗?对不对?那有几个变量啊?我们一一来学习一下。第一个的话呢,我们 称之为全变量啊,前面我也跟大家经常提及到了这个变量,对不对啊?全变量。全变量的话呢,是指在函数外面定义的这个变量,并且呢一般我们定义在整个文件比较靠前的位置啊,我们叫做全曲的变量, 那全局变量的重要性,它的使用范围就是从全局变量定义的位置开始,一直到整个文件内容结束 啊,那么它的范围就结束了。那其实对于整个工程来讲的话,我们也可以在其他的文件里面去使用这个全局变量,只不过在使用之前呢,我们要通过 xten 进行一个外部的声明啊,把这一个啊其他文件的全局变量声明到这个文件里面来, 对不对?但是需要注意的是,如果说一个全集变量我们使用了一个 static 进行修饰的话啊,就是你在这个变量全集变量定义的前面加了一个 static 的 关键字,那么这个全集变量就只允许在当前这个文件去使用,它不能够被其他的文件使用 xten 进行一个外部声明, 好吧,这个需要注意的啊,因为 static 属于静态啊,属于静态的一个全局,你可以把它理解为就是限制死了它的一个作用域,作用域的一个范围,好吧,那比如说我们呢?呃,干什么呢? 我们,我们有假设啊,去定义了这样一个函数啊, int 一个上啊,定义了一个变量啊,不是函数啊,然后呢?呃, int 一个 expr, 对 不对? 好,我们这里啊上呢,等于什么呢?等于我们的这一个 a 加 b 啊,这里没有 a 加 b, 对 吧?我们来一个 a 加 b, 那 a b 啊,就其实就是求 a 加 b 的 一个和嘛,对吧?求 a 加 b 的 和好,那么我们这里呢,你会发现 它其实它用到的这一个存储和的变量是谁?是 sum, 对 不对?它定义在整个函数外面啊,定义在函数外面啊,如果说更严格一点的话呢,我们会把它放到头文件的下面啊,放到头文件的下面, ok, 大 概是这个样子的。那也就说这个 sum 其实不单单可以在 x e, x, p, r 里面去使用,我们也可以这样的,什么?我们也可以在 main 函数里面去使用,也就是 main 函数里面,我们也可以去直接使用。什么?直接使用我们的这个 sum 啊?那么所以说 sum 它是什么呢?它是大家都可以去使用的一个变量,所以这种变量我们称之为一个选举的变量。 好吧,那这个选举变量我刚刚不是讲了可以被其他文件所去使用吗?那其他文件怎么去使用呢? 要加 external 的 关键字对不对?那 external 怎么去使用?比如说我们有一个文件叫做一点 c 啊,另外一个文件叫二点 c, 我 们在一点 c 里面呢,去定义了一个 int a 等于十,这样的一个整形选举啊,选举的一个整形变量, 那我想在二里面呢,去同样使用这个 a, 我 不想再重新定义了,怎么去使用 external 加上 int a 这样子的一个定义?声明,哎,但是 千万不要去粗制化啊,粗制化会报错啊,为什么呢?因为 a 已经在一点 c 里面被粗制化了,已经粗制化为十了嘛,对不对?那这里我们只需要告诉系统,我呢,想要使用一个 已经被定义过的整形变量,这个变量叫做 a 啊, extra, 你 可以理解为就是告诉编辑,告诉系统, 我想要去用一个其他文件中的 int a 这个变量。对,所以为什么只需要声明,不需要粗制化?声明是告诉编辑器有我要用的这一个变量是什么类型的,对吧?叫什么名字?那不需要粗制化的原因是因为它在其他文件已经粗制化了嘛? 对,那我们在这里直接 a 等于十,它等价于就把一点 c 里面的 a 给它复制为十了,好不好?就这样一个过程啊, extend 的 一个外部声明,那所谓的静态的一个声明又是什么意思呢?静态声明就是让它的这个作用域做一个约束, 比如说一点 c 里面我的 int a 这个全级变量,我在前面使用了一个 static 啊,进行了一个静态声明,对不对?静态声明,你然后在二点 c 里面去进行这个 extend 的 外部声明,声明这个 int a 的 话,它是不行的啊,它是有问题的啊,这个 a r 因为一点 c 里面的这一个 a 呢,它使用了静态的修饰符去进行声明的,所以它只作用于本文件,它不允许作用于其他文件,就做了一个约束嘛,所以 extend 在 这个里面就不行了。所以说你来看的话,两个关键字的优先级的话呢? static 它是要高于 extend 的 好吧。啊,这个大家在实际的使用过程当中还是需要注意一下,好吧,好,那么这个呢,叫全局变量,那我们全局变量它竟然是定义在函数外部的,对不对啊?那么定义在函数内部的叫什么呢?我们叫做局部的变量 啊,定义在函数内部的,我们就叫局部变量啊,我们经常使用的,对不对?在函数体或者在某个复合语句中定义的变量,我们称之为局部变量。 局部变量的重要性的话呢,就是从局部变量定义的代码那个地方开始,一直到函数结束,或者是叫复合语句结束啊,什么叫复合语句嘛? 异符啊花括号里面写的那些指令都是复合语句,对不对?那复合语句结束了,也就是我如果在异符里面啊花括号第一行就声明了一个 int a, 那 么到最后这个花括号结束的时候,这个 int a 就 不能使用了啊,它就没有用了。对啊,什么意思呢?我们看一下啊,一个四 g 代码, 比如说,呃,我们这里定义了一个 int, 对 不对? int 它是一个局部变量,它的作用域在哪里呢?它的作用域在慢函数结束它就没有了,对不对?那这个里面呢,我同样定义了一个 b 等于十, b 的 这一个作用域在哪里啊? b 的 作用域一直到 if 结束, 他就没有用了,而且他就被回收了啊,这被系统给回收的, ok 吧?那这里的呃,我们的这一个 c 他 其实也是一个局部变量啊,他是在 four 开始的时候定义的,那 four 结束了,他就没有了,对不对?好,那么这里的 k 的 话,大家注意下,我做了一个错误的一个示范啊, int k 加等于十确实是没问题的, k 是 for 循环里面的一个局部变量,对不对?但是呢,它的花括号就已经结束了,它不能到这个 k 加加里面去使用,因为 你抛开座右铭来讲,你定义在后面,你怎么可能在前面去使用吗?对不对?我们前面函数的时候我们就讲了,你要想使用一个呃,新的东西,你是不是要提前告诉编辑器,你这都放到后面去告诉编辑器,让他前面去使用,肯定会报错吗?对,肯定会报错啊,所以这样子写其实是有问题的啊,不太允许的好吧, 那么我们这样子的局部变量 int a 跟 int b, 它们两个在不同的范围之内,对不对啊?一个在慢函数的这一个层级下,一个在 ef 函数的层级下,那么不同作用域的两个变量的话呢,它必定是两个不同的且独立的一个内存空间, 即便我们这一个变量重名呢,表示这里也是 a, 也没有关系。这个 a 跟这个 a 他 不是同一个 a 啊,就是张伟跟张伟他不是同一个张伟,对不对啊?就这么个意思 啊,他们呢,是因为作用域不同,就会导致他们系统在给他们分配内存空间的时候,他们所分配到的内存空间不同,但是他们的名字可以一样, 那这个时候有同学就会有问题了。老师,那我这个相同的局部变量,我在使用的时候,那系统怎么分得清我用的是哪一个啊?系统很聪明的好不好啊?系统呢?他即便你的局部变量重名了, 那他在使用的时候,他只会往上面去找最近的那一个,比如说我们这里定义了一个 a, 对 不对?那么 a 等于十,他会找谁呢?他会找这个 a, 那 如果说这里也是 a 的 话,那等于,那怎么办?他就会找这个 a, 他 不会再往上找,他只要遇到了第一个定义了这一个 a 的, 他就 以这个为 a 为基础,不会再往上找了, ok 吧?啊?这个是系统的聪明之处好吧?啊?比如说,呃, 我们一个循环里面,对吧?有一个 int i 等于十,然后 i 啊,等于等于十,对不对?然后下面再写了一个 i 等于五,那这个时候 will i 减减,它是判断了谁呢?是第一个 i 还是第二个 i 呢?肯定是第二个 i 嘛,对不对?它不会再往上去找了的,那你如果往上找的话,那这个 i 不 就跳过了,它就没有用了吗?对不对? 所以说他只会往上找第一个, ok 吧啊?找找第一个好。同时呢,我们需要注意的是啊,我们前面学到的这个函数里面啊,是不是存在一个行参列表?那这个行参里面定义的那个什么 int a 啊, int b 它是什么呢?它是局部变量还是全局变量? 肯定是局部变量,我们说局变量的定义是什么?他是在函数外部的,那么你的行差是不是也是定义在函数体函数的头里面?函数头里面对不对?他也是符在函数内部 嘛,所以呢,他行差他其实也是属于局部变量,那么行差的话,我们需要注意的就是,行差他是 不能给时差进行赋值的,也就是它没有办法去改变时差的。也当我们主调函数,调用背调函数且实际参数为变量的时候呢,你背调函数中的形式参数的变量的值,是没有办法反过来去改变实际参数的啊。就比如说,呃, 看一下啊,我们这里假设有一个 f 一 啊, function 一 和一个 function 二,那么 function 一 里面调用了 function 二,传了一个 i, 对 不对啊?然后 int 一个 i 等于十, 那放写 r 里面呢,也要 into 一个 l 好 不好?那这样子在调用的时候,这个 i 啊,它是可以改变 l 的, l 可以 变成十,但是 l 它没有办法反过来改变 i, 这个是不允许的啊,没有办法改变的 啊,所以一定要注意一句话,我们虽然说形式参数跟这一个实际参数他都是,呃,基本上都是,呃,不是,呃形式参数,他是属于局部变量,对不对啊?我们的实际参数他可以是局部变量,也可以是局部变量,虽然他们两个都是变量,但是他们 没有办法去改变,就是你在调用的时候他是没有办法去改变实际参数的, ok 吧?啊?没办法的,而且你的这一个实际参数如果是局部变量的话,你也没有办法在函数内部通过形式参数去改变局部的这一个。呃实际参数, ok 吧,因为他们两个在不同的作用域吗?好吧。 啊,因为我我跟你讲两个在不同的座右翼,是他们的地址空间不一样嘛,对不对?形式参数的值只是被复制为了实际参数的值而已啊,两者其实是互不影响的,他们并不是两个变量在进行一个复制,而是只是单纯的我们系统从 呃实际参数里面把这一个数据拿出来了,然后放到了形式参数里面了, ok 啊,并不是由我们的这一个实际参数直接复制给他的 好吧?啊,这个是我们座右铭啊,我们在学习的时候一定要大家要严格啊,要记住啊,要要要,要那个能够想清楚的一个点好不好?

欢迎大家收看二零二六年全新制作的嵌入式开发系统教程。为了制作这套课程,我不仅翻遍了 b 站几乎所有的课程,甚至还去 youtube 观看国外的老师做的嵌入式开发教学视频。 总结下来,我发现百分之九十以上的视频都整的鱼龙混杂,滥竽充数,而且很少有一步步带着你一起做,并且详细讲解单片机实战的教程。所以我决定摒弃所有花里胡哨,用最原始、最直观、最纯真的方式呈现出来,能让大家 最直接、最快速的吸收,并且最大程度上的活学活用。所以我综合了切入式的所有知识点,用更有趣味性的课堂表述,加上知识和实操相结合的实际案例,十三个月终于做出了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识。 我们这套课程呢,会从基础篇、境界篇和项目实战篇等三大方面来讲解。第一阶段基础篇包括了 c 语言、 linux 操作系统、数据结构与算法、 linux 操作命令和算法的编程与实现。接下来是嵌入式应用的学习片,你将掌握 linux 文件、 r u 标准用 法、并发程序设计和网络编程实战等,用最易懂的方式带你入门。嵌入式开发学习提升篇学习 c 家家面向对象编程以及 u t 侵入式图形开发,并结合当下热门的音视频开发和 open 七 v 实战,逐步学习 a r n 体系结构和接口技术。系统移植、侵入式内核驱动开发全套,从而帮助我们更有效的进行故障排查和错误调试,使用内核日制调试工具和跟踪技术来定位问题, 提高驱动程序的质量和可能性。我还会提供整套课程相对应的思维导图,让大家不用来不及记笔记而烦恼。实战篇会手把手带着大家练习企业级的落地项目,比如智能工业分解系统、智能交通系统、智能机器人系统、 互联网智能家居系统等等,从而帮助大家更好的应对人工智能时代的挑战。最后呢,会给大家一个小福利,课程视频中的所有素材 有搭建嵌入式开发环境工具包,还有嵌入式学习路线图,几十上百集素材,电子书学习课间面试题和项目实战等等,只要你能想到的素材我这里几乎都有,评论留言六六六 即可全部免费打包带走。相信我,这套嵌入式系统教程将会是全网最齐全最懂的小白专用课。如果看到这里对你有所帮助的话,请给 up 主免费的一键三连吧,让更多想要学习嵌入式开发的小伙伴都能看到这个视频。 hello, 大家好,欢迎来到沁州市零基础课堂,我是乐游,那么从本节课开始,我们就正式开始沁州市的学习了,那在沁州市当中呢, c 语言的作用可谓是直观重要的啊,所以我们将会从 c 语言进行学习。 那对于有些小伙伴来讲的话啊,我们去学习一门新的编程语言,那肯定不能只学习他的皮毛吗?对不对啊,特别是我们这种 c 语言偏底层的语言。所以我们在学习 c 语言的时候呢,我们要去学习他底层的这一个逻辑和一些实现原理, 那这样子的话呢,其实会更好的帮助我们去理解它的一些运行,以及在后续的学习当中啊,我们对于硬件操作能够起到帮助。对啊,所以我们学习社语言会从底层去带大家一起学习 好,这是重要性。那么除了重要性之外呢,我们的这一个变量,它还存在一个内容啊,叫做生存期啊。什么叫生存期?生存期你可以理解为它的生命周期对不对?变量的一个生存周期,生命周期,当我们这个变量过了它的生存期之后啊,那么我们的系统呢,就会把它的内存给它释放掉啊,给它回收掉。 那取全局变量的这一个生成期呢?它是属于进程持续性的,也就是我们只要程序启动了,那么全局变量的内存就会被分配好,并且会一直存在,直到我们主动或者被动的退出这个程序,那么全局变量的 内存才会没有。那局部变量的生成期呢?很简单,普通的局部变量啊,从定义到它函数结束或者复合语句结束,也就是它的这一个作用域结束之后,那么它的生成期就结束了, 这是普通局部变量。那除了普通局部变量,还有一个不普通的局部变量啊,我们叫静态局部,对吧?静态局部呢,就是用 static 进行修饰的局部。哎,前面我们讲了啊, static 修饰局部变量的时候,它可以改变它的作用域范围,对不对? 那么在修饰我们局部变量的时候,它可以改变局部变量的生存期,也就是说只要用 static 修饰了的这个局部变量,它是可以从程序一开始就会被分配空间,哎,它变得跟我们的全局变量有点相似了啊。这个里面的规则有点相似, 就是他也会在程序开始的时候去分配空间,然后呢直到我们主动或者被动的退出程序,那么这一个局部变量就会被回收,对吧?那这里面呢有一个疑难点啊。什么点呢?就局部变量我们都知道在定义的时候有可能我们会促使化他嘛,对不对? 那我们的函数可以被重复调用,或者说我们的复合语句也可以重复调用,那我重复的定义这一个变量,我重复的给他出尺画,那不每一次他的值都是一样的吗?哎,不,在这个里面 我们的局部变量只要使用的 static 进行修饰了,那么在定义过程中的抽象它只会执行一次,也就是在定义的这个语句呢,它只会执行一遍定义。我之前就跟大家讲过定义是干嘛定义?其实就是告诉系统我要分配一个这么大的空间给到这个变量嘛,对不对?那你如果重复去分配,那不就 不符合这一个从程序一开始运行就分配内存的这一个条件了嘛,对不对?他并不是调用函数的时候分配空间,他是在程序一开始就分配空间了,所以他只会分配一次,那你分配的时候数值化他也只会执行一次啊, 对不对啊?所以说我们一般来讲就是我们定义级数值化的这种情况呢,静态局部他只会执行一次, ok, ok 吧?啊?这个是我们需要注意的呃,同时还有一个点呢在呃 大家在整个开发过程当中需要呃注意的点是,就是我们实在分不清啊,或者说我们实在没有办法去呃确定这个重要性的一个啊,这个变量的一个重要性的时候,我们可以通过花括号啊来去 制定它的重要性,比如说这里啊。 well, 我 通过花括号我其实就可以啊,制定出来这一个 i, 这个 i 它的重要性就是到 well 这里结束,对不对?但如果不写的话,可能有一点,有的时候刚开始大家学习一些语言,或者是刚开始学习编程,对吧? 我不写括号,我,我写一堆这样的东西,大家可能看起来会觉得有点脑壳痛啊,那这个 i 到底是在 word 里面呢?还是在 make 函数里面,对不对啊?有点分不清,对吧?那这个时候你就可以用花括号去给它包裹起来啊,我们去确定它的作用域, ok 吧?啊,这个就比较简单了 啊, ok, 好, 那么呃这一次的内容啊,我们就到这里就结束了,然后的话呢啊,课后大家可以去把我们之前写的这个计算程序啊,把它的一些这种计算过程的逻辑我们给它分装到一个叫做 calculation 啊,也就是计算到这个函数里面去, 好吧,啊,大家可以去尝试一下,好吧,我们下节课再见。哈喽,大家好,欢迎来到青州市零基础课堂,我是乐游, 那么,呃,在上一节课我们学习了这个函数,对吧?那现在的话呢,我们可能会有这样一个需求,就需要将两个变量的值进行一个交换,对吧?那我们怎么去做呢?采用全集变量吗?那采用全集变量的话呢,其实也是 ok 的, 对吧? 啊?比如说我们可以去定一个 a, 定一个 b 啊,然后呢去通过 ab 进行一个交换,对不对啊?用我们的这个 swap 函数, 这样子也可以交换 a 和 b 中间的一个值,对不对?但是这样子虽然可以实现功能,但是会有一些风险存在, 就是我们 a 和 b 呢,它因为是全局变量,那么表示什么啊?就可以表示其他的这些函数都可以操作 a 和 b 这两个变量,对吧?那这样子的话呢,我们数据有这一个泄露风险,容易出现异常,对吧? 那可不可以就说我们能够通过参数的形式传递到这一个 my swap 函数里面,从而去限制到啊?有只能由这个函数进行交换的一个操作呢?那我们怎么去实现呢? ok, 如果说我们把这一个函数,哎,把我们的函数呢,设置两个行差,分别为和 a 和 b, 对 不对?然后我们把 a 和 b 传入到这个 mashup 这个函数里面来,那这种形式的话呢,也会存在一个问题,就是它实际上是没有办法交换 a 和 b 的 值的,对不对? 这是为什么呢?啊?是因为我们函数的这个行差和时差是两个不同的空间参数,在传递的时候,它只是直传递嘛? 在上节课我们有提到他的不同的空间,他们在传递的时候,其实只是数据的一个拷贝过程,并没有实际的把那个空间给到我们去用,对不对?啊?是这样一个问题,那怎么样才能通过传餐的形式进行这一个数据的交换?那这个时候呢,就来到我们本节课要学的一个内容啊,指正。 首先指征这个东西啊,他其实是一个啥玩意呢?指征这个东西,比如说我们定义了一个变量 a, 对 吧?啊?定义了一个 int 类类型的变量 a, 那 实际上是由这个系统分配了一个四字节的内存单元给到他去使用了吗? 对,那么我们 a 等于十啊, a 等于一百,那其实无非就是把这个一百这个数据呢,写到或者说存储到了 a 所关联的那一个内存单元中间 去了,对不对?那比如说这 int b 等于 a, 那 无非就是把 a 里面的这一个内存单元所存储的数据给它拿出来,然后呢存储到 b 的 所关联的这个存储单元里面去。对,但这一个所谓拿出来,它并不是拿出来就没有了的,它查出来只是一个复制的过程嘛?对,就把 a 里面的这个内存单元里面的数据给它复制出来,然后写到 b 里面去,这个其实就是我们之前 在学变量的时候啊,学我们的数据类型的时候所学的一个内容嘛,对不对?那这个内容跟今天的这个职称啊,本节课的职称有什么关联呢?我们要知道的就是,在 c 语言当中,任何的一个变量,它其实都是有两层含义的,对不对啊?正如我刚刚这里所举的这个例子, 哪两层含义呢?第一层含义啊,它可以代表该变量的一个存储单元的一个位置,对不对?这个我们称之为左值嘛, l value 啊, left value。 第二种含义呢,就是代表该变量关联的那个存储单元桩中的数据,或者说数值,对吧?那这种情况这种含义的话,我们称之为数值,对吧? red value。 那 我们对于变量的访问归根结底来总结讲的话,无非就是两种情况,或者说两种操作啊。第一种的话就是把一个数据或者一个 数值给它存储,写入到这个变量名所关联的这一个内存单元当中,对吧?一个 write 的 形式啊,写入的形式。第二种操作的话呢,就是 将变量名所关联的这个内存单元中去读取这个数据出来啊。不管我是进行进行对比,进行打印也好,无非这是我取出来之后的操作嘛,对不对?那我取出来的这个过程其实就是对于变量的第二种操作了。 那么我们其实都知道了,系统他既然已经把变量名和系统分配的这一个分配给我们变量的名的这个存储空间,或者说存储地址进行了一个关联,对吧?那实际上系统他就是通过变量名关联的这个地址来访问的我们的这一个 变量里面的数据,对不对?于是乎呢?就衍生出来这一个问题,就是我们可不可以跳过变量名,直接通过地址来访问变量,对吧?那如果说我们跳过变量名,直接通过地址来访问变量的话呢?那就来到了我们这节课的重心,对吧? 指征,指征是可以跳过变量名,通过地址去直接访问我们内存单元的,那什么是指征,对吧?我都已经连续说了两次指征了,什么是指征呢?指征的概念其实非常好理解啊,就是说 系统他把内存以一个字节进行划分了之后要进行编号嘛,比如说从零零一、零零二、零零三这样子进行划分完了之后呢,这些编号其实就是属独属于这一个内存地址的地址了,它是一个无符号的整形, 所以说在 c 元当中的话,我们职称它的概念的话呢,其实跟地址是相差不差的,只不过呢,我们可以把职称是看作一个有类型的地址数据,对一个类型的地址数据, 那一个变量的这个手地址,我们称它为该变量的指,针对该变量的指,它呢是标志,或者说它代表着当前这个变量它里面存储的数据从哪个位置开始的。那么结合系统分配给这个变量的内存大小,那我就知道了, 起始位置加大小,我是不是能够确定整个范围了这个内存使用的范围了?对啊,那这个其实也是,系统为什么就是能够通过啊地址去区分,哎,我这个 int 类型是四个字节,他能够知道我要读四个字节是读哪四个字节的一个原理, ok 吧? 那一般情况来讲的话呢,我们所说的指征更多的情况下面指的是指征变量啊,更多的情况指的是指征变量,而不是单独的这一个地址。 指征变量它其实本质上是一个变量,它跟 int 类型也好,或者是 float 类型啊, char 类型也好,它都是一样的,它都是属于一个变量,只不过它是用于来存储一个对象的地址的而已,也就是它里面的内存单元是专门用来存储地址的,不存储其他东西。 好吧,所以我们学习指征更多的是学习这一个指征变量的一些操作跟用法,那指征变量怎么去定义,对不对啊?指征变量怎么去定义呢?他的定义方式、定义语法 和正常的变量定义其实是差不多的,只不过多了一个特殊的东西啊,我们的一个新号,我们的一个新号,也就类型说明符加新号加指征变量名,我们同样可以进行一个抽象,对不对?那类型说明符呢?需要注意就是该指征指向的那个内存它的类型, 比如说这个指征要指向一个 int 类型的内存地址,对不对?那么这个指征就是一个 int 类型的说明符, ok, 那 如果说 我们啊去定义这一个指征变量的时候,我定义了啊 int 类型啊,我用一个 p 来表示这个指针对,那这定义的话,不就变成了一个 int 类型的,正常的一个整形变量的定义了吗?它跟指征就不能区分了吗?对不对?所以我怎么去区分它到底是整形变量还是指征变量呢?那这个新号就起到了一个关键性的作用,它就是用来标明 这个变量,它是一个指征的, ok, 也就是说心不是和 int 结合,我们在看待它们的时候呢,心它需要和 p 进行结合,也就是心 p 表示的是一个指征,而 p 呢,表示的是一个整形变量,好吧, 啊,新 p 是 一个指数变量,而 p 是 一个整形变量, ok, 也就是说我们定义指数的时候,只要注意啊,你想要区分它到底是一个制服制制服变量也好,还是制服指数也好,我们无非就是通过一个新来区分它们嘛,对不对?通过一个新来进行区分, ok, 那 如果说我们想要去进行一个内存地址的存储,或者说获取对,这个地址的获取,怎么去获取呢?我定义了一个指增变量 p, 对 不对?然后我再定义一个 int 类型的指增 a 啊, int 类型的变量 a 啊,这个是一个指向 int 类型的这一个存储空间地址的指增变量,好吧,那这就是一个整形变量 变量。 ok 啊, int 类型的整形变量,那我定义完了之后,我想让 p 呢去保存 a 这一个变量的地址,对吧? a 它是因为 它以它是通过我们的这个正常的一个语法定义的,对不对?所以系统会分配给 a 四个字节的一个空间, 那它绑定了,或者说它关联了一个内存地址,对不对?那我可以,我 p 进来是个指征,那我应该是能够存储 a 的 地址了,对吧?怎么去存储呢?直接 p 啊, p 等于取值符 a, 那 这里的这个玩意就是取什么取?或者是叫获取 a 变量所 所关联的那个内存地址啊,就干了一件这样子的事情, 好吧,那一般情况下呢,这种情况我们会怎么说呢?就是说,哎,指正 p, 我 们这样子去描述,指正 p 指向了变量 a 啊,指向了变量 a, 所以 说叫指正嘛?对,指向,指向。什么叫指向?指向?一般就是说啊,如果说 啊,我保存了你的这一个地址,那么我可以描述为,啊,那么我可以描述为,为什么呢?为,啊,我 指向了你,对了啊,我指向了你, ok, 这个其实就是指真的一个定义,以及我们去获取它的这个地址的一个过程。 那这里需要注意的一个东西是什么呢?就是在三十二位的这一个处理器当中啊,也就是说,如果说你的 cpu 啊,是三十二位的啊,集成器是三十二位的,对不对?你操作系统是三十二位的,那么指征它能够指向的这一个,或者说能够 分配的这个内存大小也是三十二位,也就是四字节的。但如果说咱们的系统是六十四位的,那么指征变量被分配的空间大小呢,就是六十四位的,也就是八个字节。 所以总的来讲就是指征变量,他不管你强转成什么类型,因为我们转变的类型,其实无非就是转变他前面的这个类型啊,不会把指征他自己的类型转变啊,这个玩意他不会改变,只是说前面的这个指向空间的类型可以随便改, 但改了之后呢,他是不会影响到指征本身的这个大小的,也就是新批,他永远是固定的,他要么是四个字节,要么是八个字节,对吧?永远不会失真。 因此呢,我们指向外的类型的这个地址呢,我们一般称之为万用指征啊,或者是通用指征,因为外的是什么?是无对不对?是无 啊?那外的心就是一个无,不能说无指征啊,我们叫这一个通用指征,那么他没有类型的一个指征,但他是没指向了一个没有类型的空间,所以我们称他为这一个万用指征,或者说通用指征。 ok, 那这个的话呢,就是指征它的一个特性,也是我们需要注意的一个点。好到这里可能有同学就会疑问了,既然我的这一个 int 类型,对吧?前面的 int 类型它 不会影响指征的大小,那它的作用是什么,对吧?我 int 新 p, 它的作用是什么呢?我干嘛不直接搞一个 void 的 新的指征对不对?我直接搞个通用指征,谁都能用嘛,对吧?那这个时候呢, 就涉及到了指征他前面的这个类型说明符的一个作用,这个作用非常的关键,首先就是 指征的这个类型说明符的作用,干了一件什么事情呢?确定指征在进行减法运算的时候,他的布长是多少啊?加减运算的时候,他的这个布布长是多少?对啊,加减运算,他这也是随机个加啊,少了一个加字, 加减运算的时候不产是多少?同时呢,能够确定指征待对其所指向的空间进行操作的时候,每一次我要操作的这个空间大小是多少? 比如说 int 类型对不对? int 类型,我对这个指向的 int 类型空间进行操作的时候,我指征就知道啊,我操作的是四个字,减, 但是你 void 的 话,因为它是没有空间的,对不对?你啊, void 的是没有类型的,所以你根本就不知道你要操作多大的空间,所以我们指征你就算是通用指征,是万能指征,你在使用的时候,你必须要将它为具象化一个具体的类型 啊,不管是硬的类型也好,还是恰的类型也好,还是我们后面自定义的一些类型也好,都是要具体化的哦,把它具体化,因为具体化了,系统才知道咱们指征要操作的空间是多少。 好吧,那上面我所说的这个加减运算的时候,哎,时针也是可以进行加减运算的啊,那么时针进行加减运算的话呢?它移动, 也就是说我加一并不是只往后面移动一个字节,这个移动的大小,移动的数量,移动的字节数是取决于类型来的,也就是说如果咱们这个指征指向的是什么啊?咱们这个指征指向的一个 int 类型的空间, 对,指向一个 int 类型的空间,那么也就是 p 进行加一的时候,我们这个地址,比如说是在这里,对吧?啊?一二三四, ok, p 指向了这里啊, p 指向了这里,指向了这里,我加一呢,并不会移动到这里来,它是移动到哪里了?它取决于这一个类型来的,这个类型是四个字节的。 对,这个类型是四个字节,所以 p 会移动到这里来啊,也就是指向后一个 int 类型的一个空间,对吧?每一次移动的布长是多少?是四。为什么是四呢?是因为它指向的这个空间是一个 int 类型的空间,所以它必须要移动四个,也就是说咱们可以认为 针在进行加减运算的时候,他移动的这一个布长是按照类型的大小来决定的,好吧,你类型不一样,他的布长也会不一样,好吧?也就是说你指下是一个 x 类型的空间的话,你加一他是移动一个字节,你指下的是一个浪类型的空间的话,他移动是加 八个字节,对不对啊?是这样子的一个过程,好吧,所以这个一定要注意啊,因为指征我们经常会进行加减运算啊,或者说进行加运算,减运算,进行一个指征地址的一个偏移,我们要去偏移到某个内存地址去做操作吗?好吧 啊,做操作,那么直角的这一个简易算啊,我们可以来看一下啊,看一下直角的这一个简易算,首先呢,直角我刚才讲它可以进行加减运算吗?对不对啊?一般的话我们进行简易算就 ok 了啊。 接下来定义了一个 int a 啊, 叉二 b 对 吧? int 新 p e 呢,它等于了这一个橘子非,也就是 p e 指向的 a 对 不对? p r 指向的 b。 然后我们再打印一下 p e 等于啊, p e 的 地址 p e 加一的地址 p r 的 地址 p r 加一的地址,对不对? ok, 这个代码啊,我们可以直接来跑一下。好吧, 指征的这一个运算啊,指征运算点 c include 啊,加上来点 h, 好, 拿过来直接看一下啊,直接看一下,呃,我先编一下, ok, 稍等啊,稍等点干 a 点 e x e, 看 p 一 的地址是多少? p 一 是指向的 a 对 不对?也就是 a 的 地址其实是 f 七 a c 对 吧?好, p 二的地址呢,是指向的这一个恰 b 对 不对?他的这个地址是 f 七 ab, 哎呦,他们两个其实隔得很近的,对吧?那 p 一 加一变成了多少 f 七 b 零呢? b 零是多少呢?四加四,首先 c 是 多少 a? b? c 是 十二,十二加四变成了多少十六?但是我们这一个玩意是本身就是十六进制的,所以遇到十六是不是要进位?好,它要进一位,那么 a 就 会变成 b, 然后这一个后面至零,对吧?所以就相当于是加了四个字节嘛,往后面移动了四个字节, 那 p r 它是恰儿类型的,它加一变成了 f 七 ab 变成了 f 七 a c 是 不是刚好只加了一?所以这就是我刚刚前面啊, 跟大家所说的,纸真在进行这一个加减运算的时候,取决于就是他的一个布长啊,按他的一个布长来的好吧,按他的一个布长来的 好。那么纸真的变量啊,或者说纸真变量的这个类型,归根结底呢,他就是决定了纸真变量在和整形数据进行加减运算的时候啊,我说哎呀,加减 运算的时候啊,使其实际地址变化的一个倍率关系,这个就是他指增变量类型的一个作用,好吧,指增变量类型的一个作用。 但是呢,这里大家一定要注意啊,我们指增变量的话,他一般只能进行加减运算,不会去进行存储运算的,因为存储运算会出错,而且他也不允许进行存储运算。好吧,我们指增只能进行加减运算。 好,回到这里,我们纸质既然搞定了啊,我们知道什么是纸质,以及呢,我们也知道纸质是可以进行加减运算的,对不对啊?那我们也大概也了解了纸质怎么去获取这个地址, 但实际上获取这个地址的话呢,他有不同的方法,取地址符只是单纯的一种方法啊,他一般去获取呢,我们的变量会比较多啊,就是对象所关联的那个地址,对不对? 那?但是有些对象他本身就是有地址关联的,他自己本身就表示地址的,对不对?像我们前面啊,那前两节课所学的在一个宿主对吧?宿主他本质上他自己的这个名字就表示了一个地址, 你可以把宿主看成一个指征,因为他关联了一个地址好吧,他这个地址关联跟变量的地址关联是不一样的,而且他自己本身就是一个地址,你可以认为他就是一个指征变量,好吧?然后函数名本身也是一个 地址,你也可以认为他是一个纸证,老板他本身就是一个纸证,所以说我们去获取地址了,除了取地址符之外,你就要看哪些兑现,他自己名字本身就是表示地址的,他自己本身就是一个纸证的,那么你就可以直接拿过来用,不需要再进行二次的一个地址获取, 好吧,好,但是呢,我们这两种方式获取到的所有地址,他都是有类型的,不管是数主名啊啊,函数名也好,还是你取地址符也好,他们都是有类型的,他们的这一个类型 是什么呢?啊?类型是我们空间的这个类型,比如说树主名定义的是一个 int a 四啊,就是四个元素的一个 int 类型,簇主对不对?那么它指向的空间就是拥有四个 int 类型的一个空间类型 就必然会有类型的。欧巴,没问题吧?啊,那我们去描述一个地址的时候,我们不会说,哎,在一个叉二指正 啊恰字的,我们一般用这一个带星号啊,去描述一个地址类型,比如说 int 型类型的地址啊,或者说 char 型类型的地址,好吧, char 型类型, char 类型地址 一般不会这么说啊,叫恰心类型,因为恰加心表示它是一个地址,是一个指征,星号表示是一个指征嘛,对不对?那星号跟这个类型结合了,我们可以把它认为是一个带类型的地址, ok 啊,这个就是我们在使用指征,或者说我们在操作指征的时候需要要注意的一些地方。 ok, 各位 啊,同时指征取地址符,知道怎么去取了啊?那么也知道了几种取地址的方法,对不对?那如何通过我们指征去访问这个指征所指向的空间呢?也就是我最开始跟大家所提到的,如何跳过我们的变量, 通过指征去访问指向的空间,对不对?那这个时候我们就要用到一个什么东西啊?用到了一个叫做解引用符的一个符号,解引用符呢,我们也叫取值符啊,语法就是新地址啊,那么就会 直接跳到地址对应的那一个内存空间,或者是跳到那个对应的那个地址关联的那个变量,你可以这么认为,好吧,举个例子啊,举个例子, 比如说 int a 等于十,那么 a 它是一个整形变量对不对?取地址符 a 是 不是就是获取了 a 这个变量所关联的地址,那该地址类型是 int 新类型的一个指针,对不对?好,新 把这个地址给它新掉啊,也就是给它解引用掉,那么就是访问取地址符 a 这一个 int 类型指向的那个空间,对不对?但你要注意啊,一个取地址符,一个解地址符, 那两个是可以约掉的,两个是可以约掉的,所以新取地址符 a 就 直接等价于 a, 那 么直接等价于 a, 所以 说 这个玩意呢,我们拿到指征这里来的话,也就是指征它本身就是存储的一个地址,对不对?我只需要对这个地址进行解引用就可以了,如果说像上面这里的啊,我们的 p e 指向了取地址 f 就 可以了。如果说像上面这里的啊,等价于什么呢?等价于 a 这一个变量, 所以说注意啊,是等价,不是说直接等于 a 啊,他是等价于 a, 因为他跳过 a 这个变量了,我是采用的 p 一 去访问的,对不对?我是跳过了 a 这个变量,所以呢,这个就是 通过指征去访问我们的一个指向空间。对,但是需要注意的就是啊,在新一个地址的时候呢,这个表达是新任何一个地址,这个表达式是可以作为左值,也可以作为右值的。也就是说讲人话, 你兴完这个例子,解引用完这个地址之后,他既可以去存储数据,也可以去读取数据。欧巴,因为按上面我这里跟大家讲的这个例子来讲,因为新取地址符啊,他是可以约掉的,对不对?等价为,那 a, 他 作为变量来讲,他是不是既可以作为左值,也可以作为右值, 对吧?那么心取地址 f a 跟 a 是 等价的,那所以心取地址 f a 也可以作为左值,也可以作为右值去使用嘛,对不对啊?所以这个咱们需要注意一下,好吧,那么呢, 我们怎么去跳过它去使用啊?正常的来讲,比如说我们定义了一个整数,对吧?然后呢,指向了这一个变量 a, 对 不对?那心 p 等于十, 也就是什么等价于啊? p, 我 刚讲 p, 它存储了 a 的 地址,是不是就等价于取地址费?那新 p 呢?它其实就等价于新取地址费。对,新 p 地址费好,新 p 等价于 a, 那 么新 p 等于一百,是不是等价于 a 等于一百,也就是把一百复制到 a 里面去,对不对啊?是这样一个过程嘛,那你像这里也是一样的, int 等于新 p, 因为我刚把前面的这一个套逻辑给它扳过来啊,你 p 等于取对的分 a, 那 新 p 等于这一个 a, 对 不对?那新 p 既然等于 a 的 话,那 b 等于新 p, 是 不是就等价于 b 等于 a, 把 a 里面的值拿出来赋值给 b 嘛?对,就是这样一个过程嘛, 对不对啊?但是这里的话呢,我们在实际使用的过程当中,大家需要注意的一个点,就是因为心这个玩意,他跟乘号是很一样的,对不对?所以我们要区分乘法运算符和我们这个心的一个定义啊,要给他区分出来,所以你不能这样子去使用。比如说呢?啊,有这样一个例子对不对? 我们 into 一个 a 三,对吧? into 一个 a 三,然后新 p 呢?等于取电子飞啊,我只是 p 指向了 a, 对 不对?那你新 p 乘以二,那这个玩意儿,如果说你一开始 刚学啊,没搞懂的话,你是不是觉得啊,这个新 p 啊,又新个二对二做了一个结引用啊,或者说我乘以 p 再乘个二,对吧?啊?这个其实不然,那这个表达是无非就是新 p 是 做了一个结引用,结引用出来了,这个玩意其实就等价于 a 了,那就是相当于 a 乘二嘛, a 乘二等于多少?等于六,对不对啊?同样的啊,你看 把这里给它注示一下啊。呃,乘法,乘法运运算符和这一个解引用区分, ok, 拿过来引导麦,对不对?搞过来嘛。好的,嗯,继续 c 啊,回车点干 adx 是 不是六,对不对 啊?所以他其实这个括号呢?其实也有个作用啊,我们之前在学运算符的时候也跟大家讲过,这个括号是做了一个优先级处理的。对,就是先算这个里面的,那先算这个里面肯定不是成批了,他会干嘛呢?他其实是解应用批吗?对不对啊?解应用批。 好,那么我们刚刚讲了啊,我们最开始的问题,既然我们现在已经学完了,这学大概学到这里已经大概对于纸真有了一定的了解了,对吧?我们知道怎么去定义纸真,怎么去获取地址,怎么去通过纸真去进行 地址的这个,或者说这个内存的一个使用,对不对啊?间接的一个使用。那回到我们最开始的需求,我们怎么样通过啊这一个传递参数的形式把这两个变量值进行交换呢?那到这个时候我相信大家啊,应该就会了,对不对啊?前面的最开始的需求啊,解决最开始的这个需求 怎么去解决呢?很简单了,先设计一个函数啊,我们叫做 swap 这样一个函数,那 swap 传递我们都知道,你如果直接采用我们的这一个最简单的 行餐时餐变量啊,他们只是会进行直拷贝,这样直拷贝的话,我如果把地址也看成一个直,是不是也可以进行传递?对,我传地址就行了嘛?所以这个时候 我心 a 和心 b, 它们是两个指征啊?对啊,两个指征,那行仓和时仓, 行仓和时仓传递的是什么?传递的是这个值,对不对啊?也就是所谓的数据嘛,那这个时候我们的数据是什么东西呢?数据实际上是地址,对不对? ok, 那 我们拿到了这个地址,是不是就可以通过这个地址去操作我们所指向的那一个内存空间了?对,那到了这一步,我相信各位同学啊,应该就能知道 我们怎么去实现了。对,那自己直接来定义一个 t 啊,做一个中间变量等于什么?等于新 a, ok, 那 拿到咱们这个新 a 所指向的那个值,对不对?好,那我们这里新 a 啊,等于什么?等于新 b? ok 啊,新币呢?等于 t。 搞定啊,这样子我们就交换完了,对不对?交换完了啊,这个 int 其实要不要 int 都无所谓。喂的,交换完了对吧?那回到麦克斯这里, 你看,回到麦克斯这里呢,因为我们要干嘛?我们要进行交换对不对?你定义一个 int i 等于十,然后再定义一个 l 等于,呃,十二,好吧,那 获取地址可以,那么你可以这样子写, int 星 p 啊,或者说叫 pi, 好 吧,那 pi 呢?等于取地址符 i int 星 pl 等于取地址符 l, 然后 swap 这个函数,它是不是要提供两个指征?那么 pi 指征跟 pl 指征我们就给它传进来嘛?对,传进来之后,你最后打印一下我们的这一个 i 的 值啊,百分号 d i 等于百分号 d 和我们这一个 l 等于百分号 d, 好 吧, ok, i 和 l 看一下结果是不是进行了一个交换,对不对?好, ok, 这个啊,通过直角进行数值 交换,对,好,拿过来 搞定好,打印一遍。 回车啊,他告诉我,这里啊,有个东西打错了啊,分号打成冒号了啊,大家注意一下, 回车啊,没有问题,点杠 a 点 e x e i 等于十二, l 等于十,对不对? i 等于十二, l 等于十,是不是交换完成的?但注意啊,这里呢,你妥把它数据我们去进行分析,你就知道,因为把 pi 和这个 p l 传进来了,所以 a 其实就是什么? 就等价于啊, a 等价于 pi 对 不对?那 pi 等价于什么呢?等价于取地址符 i 对 不对?那么新 a 等价于我们的这一个新 pi, 那 新 pi 等价于什么?等价于我们的这一个 i, 对 吧?这不就把值拿过来了吗?那你回到这里,这里 b 也是一样的,我们的这一个 b 等价于 p l 等价于取地址符 l。 好,然后呢,我们的这一个,呃,新 b 等于等价于新 p l, 那 么新 p l 直接等价于 l, 对, 所以说 b 是 不是直接啊?新 b 是 不是也等价于 l? 那 这玩意不就是相当于做了一个把他们的数据拿出来进行的一个交换吗?但是新 a 新 b 呢? 他们所指下的这个空间,他们现在所操作的空间其实就是 l 和 r i 的 这个空间,对吧? l 和 i 的 空间,所以这才是为什么可以改变它。因为我们这里是拿到的 i 和 l 的 一个地址嘛,对不对啊? i 和 l 的 一个地址。但是啊,需要注意的是啊, 我们如果说想让 pi 和 p l 的 这个地址进行交换,那就不能这个样子了啊,就不能这个样子了好吧?啊,那因为 我们想要交换两个啊,指征保存的地址话,仅靠一个一级指征是没有办法完成的好吧,没有办法完成的啊,因为他不能完成指征的保存的这个地址进行交换,因为你把一级指征可以看成是什么了,看成就是普通的变量了, 变量直接传进去它是没办法进行交换的嘛,职称呢,相当于就是变量的高一级,它获取到了这一个变量的地址, ok 吧。啊,这个是我们需要注意的,同时呢啊,我前面也讲了啊,就是职称只能进行加减运算,不能进行乘除运算,这个一定要注意了啊, ok 吧。啊, ok, 那 么职称的这一个基础的一些概念啊,基础的一些使用的话呢,我们学到这里啊, 那么子正除了啊正常的去获取我们变量的这个地址之外呢,他还有其他的几种形式啊,比如说他可以跟宿主呢产生联系,或者说他跟宿主有一定关联,对吧? 那宿主与子正之间的这个关系是什么样子的?首先宿主元素他和普通变量是一样的对不对?他也有自己的地址,并且宿主元素间的这个地址是连续的, 那宿主跟指征机的关系是什么样子的?我们可以用一个指征来表示,或者说来表明一个现在我们定义好的一个宿主, 那么我们要知道宿主名,他是跟宿主的这个首地址有关联的嘛?对,所以说宿主名也是。为什么我在跟大家上宿主那节课的时候跟大家说过宿主名他表示的第一个元素也可以表示第一个元素的一个地址嘛?对啊,第一个元素的地址也可以表示整个宿主的一个首地址, 那比如说我们这里呢,定义了一个数组啊, a 十这样的一个数组,那 int 新 p 我 们其实可以直接什么取地址符 a 零,因为 a 零的话,是通过这个下标运算符算出了这个 a, 这个零号下标,对吧?在数值中,这个零号下标的那一个变量, 那 a 零可以看成是一个变量,那取地址符,我对这个变量进行取地址符,可不可以呢?可以啊,对吧?好,你 int 型 p r 等于 a, 那 a 是 什么呢? a 是 宿主元素宿主名嘛,对不对?我讲过宿主名可以表示第一个元素的首地址,所以它也等价于取地址符 a 零, 所以这一两个他其实是一样的,只不过写法不一样。如果说后期大家在代码里面啊,或者我在上课的时候出现了这样子的一个写法呢?大家一定要知道啊,这两种写法是一样的,没有区别。你的数组名去复制给一个整数用 对第一个元素进行取地址符啊,取地址复制给一个指定他的是一样的,他的最终的一个实现的过程,实现的一个目的都是一样的,只是说写法不同, ok 吧?啊?写法不同而已。好,那么这里 如果说我们定义一个 a 十,比如说定义了一个 a 十这样一个数组,对不对?然后 a 零,我们给它复制成一百啊,然后 int 新 p, p 等于 a, 对 吧?新 p 等于一百 啊,新 p 等于一百,那其实它等价于什么呢? a 零等于一百和新 p 等于一百没有区别。 a 零,它等价于新,趋于 f a, 那 么其实就等价于新 a 嘛? 对,为什么是新 a? 因为新号跟趋于 f 可以 约掉,那 a 零的话,表示这一个元素对不对?那你新 a, 我 讲了 a, 他可以等价于取地址符 a 零,这个地址对不对啊?等价于什么?等价于我这一个取地址符 a 零这样一个写法,那新 a 是 不是就等价于新取地址符 a 零这个写法了?所以他们是可以画等号的,他们之间是完全是可以画等号的,所以说新 p 他 既然是干嘛等于了 a, 也就是获取了 a 零的这个地址,也就是获取了数族首元素的地址,对不对?那么他等价于新 a a, 他 是宿主名,他保存了一个地址,这个地址是宿主的首地址,或者叫宿主首元素的地址。对,那他们两个可以画等号, 那同时呢,跟这个新曲就是 a 零也可以画等号,也可以跟什么 a 零画等号,所以这四个写法他都是一个东西,都是一个东西,只是写法不同 o 八,所以呢,我们在使用数组的时候,大家也可以注意一下啊,就是数组名,虽然是可以当做职称去使用,但是数组名作为职称使用的时候,是只能进行加减运算,不能进行负值运算的。为什么呢? 因为咱们的这一个数值名,它是属于一个叫做产量职称啊,或者叫一个职称产量啊,我们应该叫职称产量,不能叫产量职称啊,职称长量,为什么叫职称长量?也就是数值名它绑定的这个地址啊, 数值名,比如说 a, 它绑定的这个地址零 x c e 呢?它是固定死了的,它是没有办法去改变的,就例如 一就是一,不能变成二,对不对?那这里零 x c 就是 零 x c, 它不能变成零 x c c 啊,这样子的一个意思哇,它是一个指数产量固定不变的,欧巴固定不变的 啊,这是其实是我们指数跟一维数组的一个区别,或者是一个关系,对不对?那既然有一维数组的话, 那肯定就有二位数组跟整数的一个关系了嘛,二位数组跟整数的关系又是什么样子的?你看啊,二位数组我们可以定一个 a, 三、四,他是个二位数组,对不对?二位数组这里面的 a 是 不是可以看成是一个一位数组?这个一位数组拥有 多个元素,不过呢,这些元素都是一个数组而已嘛,对不对啊?都是一个数组而已嘛。那么 如果我们把 ai 看成是一个一维数组的数组名的话,那数组名又可以看成是一个指征的。话说如果我们要访问 ai 里面的这一个数组中的元素,是不是要在原有的基础上再进行一个指向的结引用就可以了?也就是变成 ai j 的 一个形式吧, 对不对?那通过这一个推导,我们就知道 ai 其实等价于新 a 加 i。 为什么? a 加 i, a 是 二维数组,对,加 i 是 不是表示第几行?对啊,第几行?第几个元素嘛?那新的话就是把当前这个元素给它截引用。 对,把这个地址给它截引用。那截引用出来是什么?是一维数族的地址,一个一维数族首元素的地址, 对不对?好,也就是等价于 ai 这个玩意。 ai 它是个一维数组,对不对?那 ai 接的话呢?它可以等价于什么呢?等价于心 ai 加接。 ai 是 一个一维数组,它加接,那把一维数组的数组名看成是一个指正,指正加整形是不是向后偏移地址,向后偏移地址加个心是不是做结引用?那指向的不就是这个一维数组中那一个特定,或者说, 呃,指向的那一个元素那一个变量了吗?对,所以他最终还可以转变成一个什么样子了?就是 a 加 i, 先确定行, 确定行了之后,给他星一下,就变成了一位数组,一位数组要把它作为一位数的名来看,再加接,又向后进行偏移,对,在第几列? ok, 第几列之后再解引用,就变成了这一列中的那一个对应的变量, 对吧?但这样子讲,可能大家有点绕啊,如果说我们把它转变成一个表格啊,大家可能就知道 a 加 a 呢?它其实就是一个 int 四类型的一个指数,也就是指向一个拥有四个 int 类型元素的一个指数地址,对不对啊?可以等价于什么呢?啊? 这一个一般就是我们的这个 int 四三这样子的一个类型,或者说就是 int 四三的这个二维数组,对啊,含义表示的就是 a, 这个 a 的 二维数当中的 d i 行的一个首地址。对,相当于取地址和 ai 欧巴。 那心 a 加 i 加 j 等价于什么?等价于 ai 加 j 对 不对啊?它指向的是一个 int 四类型的东西啊, int 四的一个类型东西, int 心,它指向的是个地址啊,它是一个地址, 但是呢,这个玩意它是没有接的,就是它不确定列,所以说它表达的含义其实就是这个二维数组 a 当中 d i 含 d j 类那个元素的首地址啊,类比就是取地址符 a i j, 对不对?那最后心啊,截也用括号,截也用 a 加 i 加 j, 那 是什么意思呢?其实等价于 ai 截嘛,最终它的类型就是一个整形,一个引导型的整形就是已经被完全截引用出来的东西,那 表示的含义就是二维数组 a 当中的 d i 行 d j 类的那个元素,那无非就是对应的 ai j 这个元素。对,所以说每一种写法对应的一个特定的含义,一个特定的值,我们只要去 就指正这个东西啊,他跟二维数族的一个关系。二维数族你可以把它看成是两个指人建套,一个指指向了另外一个指正,另外一个指正里面包含了一个指向的一个特定的这一个元素地址,对不对? 那我要去把这个最终的元素给他拿出来,或者说我要去使用最终的元素,你要把指正截影用一次,对,二维数族,我讲了可以把它看成一个指正指向另外一个元素吗?那一个另外这个指正指向一个元素吗?那你把 先把最上层的时针给他解引用,那是不是要解引用一次,加个心,对吧?那就变成了时针指向的那一个元素。好,那你要使用这个元素,是不是又要把这个指向的这一个元素的这个时针又给他解引用,所以就变成了两个心啊?讲的话就是什么呢?是这样的一个过程啊, 咱们把咱们的这一个二位数所得,你看成是一个这种有欠套的一个东西,好吧?有欠套的一个东西,好,这个里面呢是我们最终的这个元素啊,比如说啊,我们的这一个变量,对不对啊?变量元素 啊, p 一 啊,然后 p 二,对不对?我要这个指征指向了元素,然后 p 一 呢?又指向了 p 二,对不对?那我想要解引用,无非就要先干嘛呀?先要把外围的这个 p 给它解引用出来啊,也就是新 p 一, 对不对?那新 p 一 等于什么?等价于 p 二嘛,对不对?好,那你想要使用这个元素,是不是又要把 p 二解引用?那 p 二解引用的话,是不是新新 p 二? 哎,不对,应该是行星 p 一。 行星 p 一 啊,等价于什么呢?行星 p 一 等价于星 p 二,对不对啊?星 p 二,星 p 二,那星 p 二要等价于什么?等价于最终的这一个元素了吧, 对不对?等价于最终这个元素,所以这个就是它依次对应下去的一个关系, ok 吧? 啊?比如说咱们如果说在代码里面的话呢,我们比如说定义一个这样子的二位数字跟一位数字啊, abc 和一二三四五六啊,反向个零这样的一个过程,那你再打印什么 size of a, 看一下它的大小对不对?然后 size of b 啊, size of a 加一, size of b 加一, size of 心 啊,新 a 加一跟新 b 加一啊,我们最终看它的结果是什么样子的啊?虽然我已经把答案给大家写出来了啊,但是呢,这个玩意儿我们还是实际运算一下啊,这个数组与时针的关系, 好来实际看一下啊,它最终的一个运算结果, ok 啊,我就懒得写 return 了啊,懒得写 return 了,走,你 回车点杠。 a 加 e x e 对 三八 b 为什么是三? size of a? 也就是求这个数的大小就是三, 对不对?八?八是什么啊?塞子? a 加一,那八就是指征的大小嘛, a 是 数组嘛?数组又可以看成指征嘛,就是一个地址嘛,地址加一,那不还是地址嘛?地址的大小是固定不变的,所以是八, 对不对? a 加一, a 是 看成数组名,数组名表示为首地址首元素的这个地址,那首元素的地址再往后偏移,是不是就来到了 b 的 这个地址? b 的 地址进行解引用,是不是就是 b 了? 这样子来的?好,那再看第二个这个 b 啊,我们的 b 数组 b 数组的话,它的大小是多少?是六。为什么是六?是二乘三得六吗?对,二乘三得六啊。 然后的话呢? size of b 加一也是一样的, b 也可以,它也是数组名呢,数组名它对应了一个地址呢,这个地址加一不还是地址吗?地址加一还是地址,所以固定不变还是八个字节啊?因为我是六十四位的系统好不好。然后新号 b 加一, b 往后偏移。 b 往后偏移是什么? 哎,你这,我这里打印的是百分号 s 啊,也就是 b, 他 是一个大的宿主,加一是不是从这个位置跳到这一个宿主来了,对吧?这从前面这个宿主往后面这个宿主跳吗? 因为 b 本身对应的是第一个元素的地址吗?第一个元素的地址是不是一个数组?数组的话,他 取了他的地址,是不是我就指向了他这样一个类型,拥有三个恰类型的一个空间地址,对不对?那我偏移的时候是不是要移动三个字节? ok, 一个两个,三个到这里刚好到这里啊,就三,后面到四开头。 那你在百分号 s 打印的时候是不是四五?因为遇到反斜杠零结束嘛,所以最后打印出来就是四五啊,这就是为什么结果是三八 b 六四六八四五。好吧,这是原因啊,这是原因。 那这个的话呢,就是咱们的这个数组和时针之间的一个关系啊,包括一维数组和二维数组与时针的一个关系。 那同时呢,大家应该也看到了啊,咱们这个代码里面他就涉及到了什么,涉及到了这个制服数组,对不对?那这是制服数组,那除了制服数组,我们之前应该也接触了这一个制串嘛,对不对?制服串跟时针他也是有关系的, 但是制符串是不能和制符数组画等号的,你要注意啊,制符数组是制符数组,制符串又是制符串,因为在 c 语言当中, 在 c 语言当中并没有这一个所谓的内置的制符串类型,制符串类型是俊,它只是在 c 加里面出现的啊, 那么 c 语言的制符串呢?是通过切尔心时针,哎,你注意它是个时针来实现的,知道吧?比如说我们可以定义制符串可以通过什么切尔心啊?时针一, 然后双引号 a、 b、 c, d, e, f、 g。 对, 定义了一个恰耳型类型的指数,那其只保存为 a、 b, c, d, e, f、 g 这个常量自创的首地址,那自创 a、 b, c, d, e, f、 g 会保存在点 out data 段中,也就是止读区,或者咱们叫做常量区当中,对不对? 那同时呢,我们可以通过一个什么 s、 t、 r 的 这样一个驻宿主也可以去存储 a、 b、 c, d, e, f 机,但它有区别的啊,那定义的这个宿主呢,它是会将其元素逐步粗化为 a、 b、 c, d, e、 f 机, 注意这里的 a、 b、 c、 d、 f 机,它还是存储在 i o 点代码里面,但是 s、 t、 r 二、 h 二里面的这个元素存储的 a、 b、 c、 d、 f 机,它是放在 站区,放在站区欧巴,也就是在这个里面,虽然你只看到了一个 a、 b、 c、 d、 f 机,它实际上底层会出来过两个 a、 b、 c、 d、 f 机, 因为你采用数组啊,我们的这一个,哎,等一下啊,我们采用数组的形式去促使化咱们的啊,通过自创的形式去促使化咱们的这个数组的时候,对不对啊?它会有问题的。 a、 b、 c、 d、 e、 f、 g。 这里他有自己的空间,这个空间多大呢?取决于初次化的这一个数量对不对?初次化的数量是 a、 b、 c, f, g, ok, a, b, c, d, e、 f, g, ok, 他 初次化完毕了,后面加一个反斜杠零, 对,加一个反斜杠零啊,当然这里其实没有反斜杠零啊,有反斜杠零啊,等一下,有反斜杠零,就多了一个字母,有反斜杠零在这里,他存储在这一个战区。 好吧,重复来占取,但这个网页它不会说直接把它放进来,它是通过一个 copy 的 形式,通过口味的形式,它本质上还是在 auto data 里面 啊,它本质上还是在点 auto data 的 这个产量区,所以它会出出现两个 a、 b、 c、 d、 f 机,一个产量区会有,一个战区会有。好吧,这个我们要注意啊,我们要注意这个里面的 a、 b、 c、 d、 f 机呢,它是不能动它的,就是你不能修改 a、 b、 c、 d, f 机,但是这个里面的 a、 b、 c、 d、 f 机是可以修改的, 好不好?是可以修改的,没问题吧?然后我刚讲的这里初次化它会多一个字母对不对?为什么会多一个字母呢?因为 a、 b、 c、 d、 e、 f、 g。 在 上数代码里面它把字母串啊。首先第一个是俊一,它只拿到了手地址,它其实是没有说拷贝它的, 那由于自创有增值服务系统,是可以把自创的完整内容进行访问的,对不对?遇到反行楷林的后面是默认有一个反行楷林的,只是我们看不到,好吧,然后这里的话呢,他是进行的拷贝啊,拷贝进来的,因为拷贝他也有一个反行楷林,我们虽然看不到,但是会给他分配空间, 好吧,会给分配空间,也就是逐个初识化和自主创初识化的区别就是在于自主创初识化的过程当中,他是会增加一个反斜杠铃,而逐个初识化的过程当中,像这种方式他是不会自动增加反斜杠铃的。 好吧,欧巴,这个就是我们自创与指正的一个关系啊,你千万一定要注意啊,自创跟指正他们其实自创本质上他如果说我们使用产量自创的话,直接用指直线就可以了,但是不能改,对不对?但我们也可以把这个产量的自创 进行一个拷贝,拷贝到我们的这个数组里面去。虽然说我们在使用过程当中,我们用的很多的可能就是制服数组,但是呢,你不能把制服数组跟制服串画等号好吧?不能画等号,他们虽然说很相似,但是不一样。好吧, 那除了指正跟制服串有关系,跟数值有关系之外呢?他还存在另外两种形式啊,你要注意 咱们的子正还出现另外哪两种形式呢?第一种形式咱们叫做浪子正,那第二种形式叫做也子正。什么叫浪子正?浪子正其实就是系统啊,浪也叫空子正啊,浪也叫空 浪子正,所以也叫空子正。浪是系统定义的第一个红,它值就为零啊,表示不止向任何空间。好吧,那定义的时候呢,其实就是把子正先定义出来,然后复制为浪就可以了,这个就是叫空子正, 就叫孔子证啊,孔子证就是一个 void 新类型的一个零啊,指向一个地址为零的地方,但是你要知道,地址为零的地方,它是不能被访问的,也就是地址为零这个玩意,它是个假的地方,就是一个很虚拟的一个虚的东西,它不能反被访问。如果你访问这个浪,百分之一 万啊,百分之一千,百分之一万啊,都会报错,好吧,绝对会报错。所以定义浪的这个原因呢,并不是说我为了让别人去报错, 只是单纯的预防,我们在使用过程当中没有让它指向其他地方,对吧?比如说什么呢?比如说咱们这里啊, p 一 开始就没有指向地方,对它,我直接访问 p 可能会访问到一些不该访问的东西,或者说访问到一些非法的东西, 对不对?那这样子肯定会造成什么?造成我们的这一个访问错误啊,或者说数据异常的情况出现嘛?所以这个 non 就是 为了去避免不确定的 bug 所出现的一个 预防极致。好吧,预防极致这个是浪子针啊,除了浪子针,还有一个东西叫野子针,对不对?野子针是什么东西呢? 野子针不是浪子针,注意,野子针不是浪子针,野子针是指向了一个根本不知道的地址啊。那野子针的形成原因两种情况,第一种定义了子针没有出错话啊,像上面这里所写的啊,定了 p 没有出错,那么这个 p 在 这个时候是野子针了啊,复完子之后就不是野子针了, 所以这个时候是第一种。第二种就是指征在被释放了或者被 delete 了之后没有自控,对吧?没有把它复制为浪,让我们误认为这个指征还是一个合法的指征,那这个时候他也是一个空指征,因为空间都已经啊,这也是一个野指征,因为空间都已经不在了, 对吧?不在这个空间,你不在了,你就不知道这个空间能不能访问,所以他就是一个野指征。好吧,比如说我们如果说上面的 spa 啊,进行访问的时候,新 p 它是个野指征,对不对 啊?你新 p 等于 a 可以 吗?新 p 等于 a 不 行哦,因为新 p 等于 a 是 结弦的 p 所指向的那个地址,那这里因为没有明确赋值, p 是 属于也指向的地址是哪里,你去访问它的空间,要么出错,要么数据异常 o 吧,所以一定一定要注意,不要去定义也指征,当我们不知道指征指向何处的时候,那么我们就让指征指向空即可,好吧,指向空即可 o 吧,没有吧,这个 好,那么我们回顾一下前面我们啊本期本节课所学的这个内容,对吧?关于职称呢,我们知道了啊,他是记录的一个存储空间的首地址,对,从而我们去操作啊,可以通过职称去操作这个空间,那么请大家啊,我们一起来分析一下以下的这个代码。 叉二新啊, s t r 等于 a, b, c, d, e, a, b, c, d, e, 对 不对?然后叉二代码二十等于一二三四五六,叉 comst, s t r 等于,哎,一个空,对,等于一个空。好,那这个时候请大家想一下啊, 这个代码它有什么区别?这有什么区别,对吧?叉二新, s, t, r, e 如果按上面我所讲的话,它指向的是一个产量指数,一个点 r, o, d, t 段,对不对?所以说 s t r 它是什么?它指向的是一个产量,它不能修改所指向的这个内容,对不对? 但是 s t, r 它可以指向改变啊,改变它的指向,也就是我 s t r 一 不指向 a, b, c, d, e 这个产量指数了,从而指向一二三四五六,这个产量指数是不是也可以? 那 data 是 什么 data? 它是一个宿主嘛,对不对?这副宿主随便改。但是下面的 str 二是什么呢?它被一个 const 修饰了,注意,被 const 修饰了,所以它不能改变指征的指向,但是 str 二可以修改指向空间的内容,所以这个玩意你会。

理工科专业以及所有想转行签约式的朋友们看过来,今天这期视频给大家分享一套从零开始,可以直接照着抄的签约式软件,完整的学习路线。另外呢,我还整理了全套签约式学习资料,包括签约式三大入门基础课、签约式经典电子书籍、签约式实战项目等。需要的同学们呢,我直接免费分享给你。第一步,底层基础 c 语言和基础硬件。 很多小白呢,一上来就着急学单片机,基础没扎牢,学什么都会费劲的,越学越懵,而且会直接放弃。第一步,咱们先 ctrl c 语言,这是咱们嵌有式的核心语言,不用学太复杂的,专攻高频,靠点像指真结构、体位操作这些重点,练实操,不用死记硬背,每天抽点时间学,一个月的时间左右就能搞定, 足够支撑你后续的单片机学习。推荐大家去看一看这个视频还有一个关键点,搞嵌有式软件绝对不懂,硬件不用学到硬件工程师那么深,但是基础硬件常识必须会 能够看懂。芯片 data sheet 会分析简单的硬件原理图,会基本的 pcb 绘制和焊接。新手呢,直接看佳利创的免费教程就行,操作简单,还能够低成本做出自己的第一块 pcb 版,入门门槛特别的低。第二步呢,是入门单片机基础五幺和进阶三二,这是前摇式的核心,分两个阶段学,先啃五幺单片机,妥妥的入门神器, 逻辑简单,极易上手,特别适合大一大二的在校生或者是纯基础的小白,专门帮你建立单片机编程思维,彻底搞懂硬件和软件的联动逻辑, 三到四周左右就足够了,别太快,踏踏实实把点亮 led 按键控制技术、传感器读取,这些小实验做会了,技术就算打捞了,把底层逻辑摸透比啥都重要。大三大四, 着急要找工作,着急转行就业的同学们,建议你们直接冲 stm 三二。现在签约式就业的主力单机,市面上百分之八十以上的签约式岗位都要求会 stm 三二是必学的硬核技能,相比五幺呢, stm 三二的这个功能更全,知识点更多,建议留出五到六周系统性学习, 别跳步,别偷懒。纪存希操作各类外设驱动,这些核心内容一定要看扎实,推荐去看一看这个视频重点提醒,光学理论不实操等于白学。代码呢,一定要自己亲手敲,别复制粘贴。从简单的温控蓝牙模块到综合性的小项目,一步一步动手做,做完呢,实操能力直接飞升, 改一改功能还能当自己的毕业设计竞赛项目含金量呢,直接拉满。实战项目也包含在资料包里边了,需要的同学点击六六六免费分享。第三步,系统进阶 r t o s。 和林肯克斯操作系统,单片机裸机开发,熟练练透之后,想往自身的千万式方向走,就必须学操作系统,这是入门到进阶的分水岭,也是掌心的关键一步。 先学福瑞 r t o s。 实时操作系统,轻量级新手友好,专门解决多任务调度问题,应对工业智能设备场景,刚好三到四周就能够掌握核心用法,上升很快, r t o s。 学完紧接着冲窍舍 linux 这块的内容相对要多一点,重点抓内核、剪裁、驱动、开发、设备、数这几块核心,留出六到八周的时间系统性的学习,学完之后你的就业选择直接扩宽于大节, 薪资水平也能够上一个档次,推荐大家去看一看这两个视频。第四步,深度强化冲大厂高新。前面三个阶段学透,找一份普通千万式工作完全没有问题,如果想进大厂冲高新岗位,提升核心竞争力,就再花四到五周。强化底层硬件知识、数据结构、计算机组成原理、千万式常用算法, 这些内容能够帮你彻底吃透底层逻辑,不管是做工业级高端开发,还是应对大厂笔试面试,都超级有优势。同样学完一定要结合实战项目落地,把知识点真正的用起来,才算彻底掌握,而不是纸上谈兵。小白的这个避坑指南。一、别盲目囤开发板买资料, 先从低成本的 s t m 三二入门板开始,一块板子就足够你用很久了。二、别只看视频不实操,代码一定要自己敲,项目一定要自己做,动手才是千万事的核心。三、别急于求成,按照时长一步步来, 基础打捞比啥都重要,双飞的同学踏踏实实学,照样能够拿高薪。千万是这条路,只要方向对,坚持下去真的能够看到结果。同学们可以在评论区里打出你的年级加专业,我可以根据我的经验帮你规划一下。


hello, 大家好啊,我是雨宁,今天来给大家分享一下啊,学习就是开发啊,有哪些书籍可以去哎看可以去推荐的啊。呃,接下来啊,这是我们的整个视频的一个流程啊,首先啊,我将按照一个从软件到硬件的这个顺序来介绍。 呃, ok, 先来说一下什么呢,我们这个就是开发的学习路径的一个概述啊。呃,首先啊,就是 c 语言对吧,这就是开始,然后进入到数据结构啊,再去学算法 leix c 加加 q t 单片机阿姆啊,我们大致是这个顺序。 当然啊,你可以去把我刚才说的这个当做你的就是学习路线啊,完全是没有什么问题的。首先啊,你可以去把我刚才说的这个当做你的就是学习路线啊。呃, 可以这么说,不管你是什么专,呃,不管你在大学里面是计算机啊,电子通信还是自动化的,甚至说啊,你是一个机械专业的同学,你在大一的时候啊,你都会去学 c 语言 啊,并且啊,绝大多数的一个高校他所选择的这个教材其实都是谭浩强的这本书啊,叫做 c 语言程序设计这本书。为什么用这本书呢?是因为他的很简单啊,也很基础, 最适合一个初学者啊,当然你除了这本书之外还有什么嘞?还有这个 c 和指征啊,这本书它也很适合初学者,从最基本的这个数据类型它开始啊,包括像是控制结构计算呢,哎,符合表达式啊, 指征啊,数组啊,函数啊,对不对,还有这内存管理啊,内容其实很全,对初学者而言啊,也很友好。 哎然后呢,当你有了 c 语言基础之后啊,你可以去看啊 c 专家编程这本书。呃,这本书他不适合初学者啊,他不适合初学者,他一定是有一定基础的。为什么这么说?是因为他这本书他一上来他就给你在讲什么?在讲这指征和数字的区别 啊,啊,然后呢,就会去讲这个动态库,静态库,还有这个对内存的一些思考,对吧?如果说啊,你想去提升你的这个 c 语言,你可以去看这本书啊,啊,那然后最后还有一本叫做高质量 c 编程啊,这本书其实也是有很多高校去把它当做一个 教科书啊去使用的。 ok 啊,在我们私语言之后啊,进入到下一个内容啊,数据结构啊,接下来就是一个数据结构,对吧?学习数据结构呢,我比较推荐的是这本书啊,叫做大话数据结构这本书。 因为什么呢?是因为这本书他适合初学者啊,为什么?因为他这本书上的这个图啊,非常非常多啊,这个图帮助你理解。哎,你对于其中那些结构理解起来也很容易。 内容呢?他也很全啊,他内容包含了什么?包含了像是限行结构啊,包括这个顺序表、单链表,对吧?双向链表,循环链表啊,然后站队列、字母串,数形结构啊,图形结构,对不对?这些东西他都有啊,还有什么呢?他还会包含了一部分的算法。 呃,算法呢?在这本书里啊,在大话术语结构这本书里包括什么?包括最基本的查找算法、排序算法。哎,所以说啊,你可以去把这本书当做一个数据结构这块内容的一个入门书籍,完全是没问题的啊,也是非常合适的。 再者之后呢,你就是去看算法导论啊,算法导论这本书啊,他是更偏重于算法一些啊,他是一定是适合于有基础有算法基础的同学。呃, 就是说你在这本书里你去看到这个堆排序啊,病规排序啊,还有像是动态规划呀,哎,贪心。算法呀,这些东西你放在这本书里啊,这是个常规内容 对吧?你这也能看得出来这本书啊,想把它吃透啊,也不容易对不对?呃,其实也有很多同学在迷惑啊,也不理解为什么你学切入式啊,你还要去学算法对不对?呃,首先啊,我就这么说啊,第一个啊,为了你能够入这行的一个笔试问题, 越是大厂他考察的数据结构的一个内容他越多啊。第二个就是他的一个操作系统本身啊,他也涉及了很多的一个数据结构啊,如果说啊,你在前期不搞这东西,那么你到后面做开发做到一半之后,你要在下班之后回来还是要学的 啊,还不如提前学好呢,是不啊,这就是数据结构啊,和算法相关的,再往下啊,就是 linux 对 吧? linux 学习啊,我把它分为了两个步骤啊,首先啊,是什么?是 linux 基础啊,也是基础命令啊。然后呢,再会到这个 linux 系统编程,把它分为两步走。 首先我们先来看一下去讲操作系统这本书啊,有哪些值得推荐的啊?呃首先就是这个鸟哥的私房菜这本书啊,它这个鸟哥私房菜这本书呢,它分为两个版本啊,一个是基础版本,一个是服务器版本啊。 呃,其实这本书的知名度挺高的,但是啊,我是我没,我没怎么去看过。呃,如果说你有一定的这个 linux 基础的话,我比较推荐你去看这本书,叫做 linux 高性能服务器编程啊,为什么推荐这本书呢?是因为上面的一个代码很多啊,并且它上面的代码都是完整代码,它不是伪代码啊, 你可以去直接去翻译运行啊。呃,它既然是在说服务器编程的,所以说啊,它这本书其实它侧重于这个并发操作,比如说啊,进程之间啊,进程与进程之间的一个通信 啊啊,这个进程池与进程池啊,还有什么 tcp u d p 这些东西,这些东西它是比较适合有一定编程基础的同学啊。当然啊, 你学到这里的时候你会发现,哎, linux 其实应用层啊,其实掌握的差不多了,那么你这时候就要回去去看什么?看这个 linux 内核, 那 linux 内核呢,我比较推荐这本书叫做 linux 内核设计与实现这本书。这本书啊,它内容不是很多啊,总共是三百多页左右啊,但是这本书内啊含盖的东西很多,包括了进程管理啊,这个终端内存 啊,还有这个内存管理啊这些东西。最后啊,就是一个 linux 驱动啊,推荐呢,给大家去看这个 linux 设备驱动这本书啊,和很多的 linux 驱设备驱动开发详解啊,这两本书结合起来去看。呃,前面这本呢是一个国外的一本书啊,后者呢是出自于国内的这个 啊,宋宝华老师的这本书啊, ok, 呃,你完成了 linux 阶段学习之后啊,你接下来就要进入到这个 c c 家家了,对不对啊?其实很多同学他不理解啊, 这个学习先后试啊,有没有必要去学 c 加加这本书啊?有没有去学 c 加加对不对?呃其实要我说的话呢,其实学 c 加加还是比较重要的啊,首先啊,你笔试的时候你的笔试题它很多内容其实是 c 语言和 c 加加它其实是混在一起的,并且你去学 c 加加呢,你还能更好的去理解 c 语言这东西啊。 再者说啊,你做做一个旧式的一个应用开发啊,比如说。呃应用开发的时候它也会去涉及到这个 c 加加,比如说啊,这个 qt 对 不对?你 qt 你 也要去学 c 加加对不对?这里啊,就 c 加加这段时间给大家去推这个啊,叫做 c 加加 prever 啊, premer 这本书,它这本书的内容其实很全啊,非常全面,它从 c 语言的一个最基本的数据类型它开始讲的啊, 然后呢会讲到面向对象的一个抽象分装啊,然后呢还有继承多肽对吧,它是这种逐步渐进式的,非常适合小白选手啊 啊当然软件部分啊,也是最后的啊,也是 q t 啊 q t 比较经典的就是这 q t 五开发实力啊。呃但是这本书内容非常非常多啊,建议大家不要说是把它去当做一个查阅啊,用查阅的方式来读它啊。 呃 qt 当中啊,你经常用到的一些东西呢,其实就是占了 qt 总内容的一个百分之二十左右那 呃然后再来说一下硬件部分吧啊硬件部分其实包括了什么呢?包括了五幺,单片机, stm 三二,还有 arm 对 不对?呃学习硬件呢,我其实更推荐看视频 啊,推荐看视频,你去买一块开发版啊,一边听课一边写程序,然后去下载进去去看现象,这是我比较推荐的这么一个方法啊。 当然啊,我也去整理了一些书籍啊,如果说啊,你有需要的话,你可以在评论区啊去留言,书籍我私信发给你。没问题啊。然后呢,你也可以去私信我啊,去联系一下啊,或者说你对切肉食行业有什么看法,或者说你对哪个技术点有什么问题啊, 你都可以留给我啊,然后我看到的话我会给你回复的。 ok, 那 么我们本期视频啊到这里就要跟大家说再见了。哎,希望大家都能再走上青州市开发这条路啊,越走越顺利啊,越走越高。 ok 啊,拜拜。

如果你想从事嵌式开发,我非常推荐的学习路径是五幺单频机、 stm、 三二 free iqs 和嵌式 linux 操作系统。那么为什么要首先推荐一下学习五幺单频机呢?因为通过学习五幺单频机,我们首先可以掌握单频机的外部电路啊,因为单频机是偏硬件的,所以掌握外部电路非常非常重要。 第二呢,通过学习五幺代分机,可以整巩固你的细语言编程技术,你可以掌握你的纸针、结构体酶具体等复杂的应用。 通过学习五幺代分机,你可以了解一下代分机的内部外设,比如说它的 iu 口,它的串口,它的定时器,它的中断运行机制等等。 那这都是为你将来学习建筑开发打下一个良好的基础啊。那么万丈平楼高地起,打好基础呢,才有利于将来啊飞的更高。那学习五幺大飞机,我非常推荐这本,手把手教你学五幺大飞机这本书。这本书呢是第三版,是清华大学出版的出版, 它荣获第四届中国大学出版优秀畅销书一等奖,已经被全国现在三百多所高校采用作为教科书, 那么你也可以拿回去自学也可以,如果说您是老师的话,也可以采购这本书作为教材。希望这本书呢,能够帮助大家,帮助同学们,帮助想进入建筑师开发的这个所有的电子爱好者啊,打下一个良好的基础。好,谢谢!

今天想和刚开始学习潜入式开发的朋友分享一个我亲自走过的弯路和心得。最开始我和很多人一样,拿到一个项目就从没喊出,开始一行一行往下应读,试图理解每一句代码。 但很快我就发现这个方法效率太低了,尤其是面对企业里那些大型项目, 代码量巨大,架构复杂,想靠这种方法完全吃透,非常耗时,而且容易迷失在细节里,半天抓不住重点。后来经过不断学习和不断 c v 别人代码的过程中,发现复刻或学习别人项目时, 不要一开始就陷入代码细节。我建议先花时间去了解整个项目的整体流程和核心框架,他先做什么后做什么,就像看地图,先看竹竿道,而不是盯着每一条小巷。先把这条竹竿道跑通,在心里建立起一个清晰的脉络和骨架。 之后你再带着这个框架去查看具体的模块和代码,实现就会事半功倍,知道这段代码在全剧中扮演什么角色,这样也可以帮你建立起一种框架的思想。希望这个方法能帮你更高效的学习,把精力用在真正关键的地方。

和大家分享一下我当初呢是如何四个月快速入门财务室拿到十家大厂 offer 的。 给大家准备了我会整理的财务室自学资源,包括学习路线,视频教程,学习笔记,实战项目,简历模板, 面试题等等,这些都可以分享给大家。第一步, c 语言财务室不管什么产品,用的都是 c 语言和数据结构,学完了第一阶段的这个 c 语言和 c 高级入门,我们基本上都会看懂些代码,会简单的条库。 c 语言重点是学习站队列数结构,还有列表, 因为可以更好的编辑程序,这个是我们进入这个方向必须要会的。网上这些资源有很多,就比如说温凯,郝斌,小甲鱼,小妹老师,找一个你自己能够听得下去的就行, 但要注意,你只刷课是学不会的,眼睛看会了,但是呢,一动手就废了。 c 语言学习一定要自己动手去敲一敲代码,我当初给自己的定的目标就是每天能够敲够三百行,管不住自己的同学,可以跟着小妹老师的教程,手把手带你敲代码。最终呢,你要把 c 语言的一些个经典面试题都刷完,做完一个完整的 c 语言项目,比如写一个五子棋。 第二步,补一下硬件基础,咱们的理工专业,你不管在大学学的怎么样,多多少少都学过一些个电子电路,数模电,只要复习一下重点就可以了。 元气件呢,你重点学习几个常用的,像电阻,电容,电感二极管,三极管,还有冒死管,顶多加一个运放电路。我的一个学习技巧是一定要自己买元气件,亲自打电路,结合仿真工具学,最终能够看懂简单的电路原理图就行了。这里注意你不要死磕磨电,遇到不会就绕过去,把常见的掌握了就行,要不然很容易从入门到放弃。 大家可以看一看一周搞定什么店的这个教程,那里面都是重点中的重点。第三步是 s c m 三二的学习。我先说一下我学习大牌机的这个窍门,你一定要一边做项目,一边学习这些接口外设,成就感来的特别快,你做完了一个项目呢,常见的接口都用到了,项目也有了 重点,你要去学习一下这些,像 gpl 中断电视机系统、时钟看门狗这些,还有 iphone 啦, s p 啦, uata a d c dac, 还有单动线协议,这些都是必要的。我当初做的是智能语音小助手、智能桌面小狗,智能蓝牙音箱、智能运动手表四个项目, 项目资源可以无偿分享给大家。第四步是学习咱们的 r t o s 加 l v g l r t o s 的 学习技巧是你先会用,再深入原理和原码。 对于新手呢,强烈建议你先从 free r t o s 开始,它的代码量较小,资源呢更丰富一些,而且在 s t m 三二的 q o max 里边,你也可以无缝生成工程上学呢,非常的快。学习路径,先跑起来, 重点学习任务的创建、启动、挂起等基本操作,熟悉信号量、消息队列、忽视量等这些任务间通信机制的 ap 函数。这个阶段的目标是能够用 r t o s。 写出一个完整的程序,再理解思维的转变,最核心的是从裸机单任务顺序执行转变为 r t o s。 的 这个多任务并发执行, 可以尝试把一个逻辑项目用 r t o s, 你 就自己重新给它重构,重写一遍,对比感受这些差异。最后做一个小项目,可以尝试做一个多任务数据采集系统,比如一个任务负责采集传感器数据,另一个任务负责通过串口发送数据。第三个的任务控制 led 灯,它的这个闪烁 像正点原子火、鬼头山的 r t o s。 这些视频教程都很受欢迎,可以根据自己的这个喜好选择一下。第五步,修改简历,加上刷面试题, 想要获得更多的这些面试机会,这里写简历有一个小技巧,那就是先去看一看你自己的目标公司,他的招聘要求你把里面的这些关键词技能点合理的发到自己的简历上面,有些内容你不好意思写精通,就改成了解,掌握背后的逻辑很现实。 hrc 简历的时候,很多时候就是在关键词上进行匹配,你对上了,那你才有面试机会。 也给大家提供了一些优秀的已经深爱的这些简历模板,大家可以参考一下,其实就是去刷面试题了,如果你时间紧张,马上就要去面试了,就不要提海战术了, 效率就太低了。优先备这两百道千兆式高频面试题,包含了绝大部分的考点,也是我之前面试汇总整理的,有问题就拿,大家还有什么问题也可以在评论区告诉我,我有时间都会回复的。下一期给大家讲一讲学习单片机如何选购开发吧!

自学切入式买开发板并不是越贵越好,网上推荐的五花八门,买回来一堆全吃灰,不仅浪费钱,也没学好单片机大衣,想入门单片机,闭眼选择五幺开发板, 也不需要买套件,就买一块外围带的常用外设的传感器核心板就行。把 c 元基础语法摸透,就可以快速上手。搭配原理图和芯片手册,熟悉计算器开发流程,然后再进阶 stm 三二学习库函数开发流程, 从 g p l 到 d m a 常用外设都跑一遍,搭配 wifi 蓝牙模块,做一些互联网项目练手。我整理了一份从入门到就业的全套切入式学习思维导图,自学过程中常见问题、坑点,学习重要的知识点里面都汇总好了,需要的同学留言六六六。

工作了十年的幼师工程师,日常开发时会用到哪一些工具?这是我过去两个月做的一套开发必备的工具集合,包含了 pcb 设计参数、在线调试、稍入仿真、加密校验、学习路线等开发中常用的工具, 新手打开浏览器就能快速用起来,建议先收藏,方便以后使用。先看硬件和 pcb 模块,这一块基本包含了硬件领域的高频需求, 你可以输入过孔的参数,计算 p c p 过孔的最大电流,根据所需的电流反推应该设置的走线宽度。二进置文件查看器呢,方便你可以快速的查看固件的内容。 而电池续航计算器支持多种功耗计算, led 限流电阻计算能帮你快速计算创并连的阻值。而电阻设防工具和 s m d 的 私映助手能够帮助你快速的计算远近的参数。 r c r l 的 滤波计算器呢, 则支持高低通参数计算,并显示富平险运曲线。 esp 三二在线烧录可以让你在网页端就可以快速的刷固件电路。在线仿真,支持阿丢诺、 esp 三二、 s t 三二等开发版。 而芯片手册查询呢,还能下载海量的 data 讯,你在做硬件设计时所需的核心工具在这一块基本都配齐了。然后再看创口和网络调试器, web 创口助手可以让你打开浏览器就能快速的调试创口。 htp 客户端呢,支持多种请求头和参数,和传统的客户端工具相比,你再也不需要安装,排查问题更加灵活。 另外还有代码格式化、代码对比和日子查看器,支持代码格式化,实时对比新旧版本代码的差异。日子查看器呢,支持大文件加载过滤和关键字高量,你在改代码查日子的时候将会非常方便。 夏班的 ai 助手呢,则是智能辅助部分,内置的支持各类大模型 ai 和聊天助手。而小智同学呢,则是基于小智学堂课程资料训练的打印助手,你在学习的时候遇到问题可以随时提问,接纳于身边多了一个二十四小时的助教。 除此之外,还包含了常用的 c r c 算法哈, c 算法被是六十四的编辑码以及进字转换也未操作的工具模块,你在做协议解析和计算器分析的时候,这一块应该会用得上。 最后,时间和计算器模块可以帮你解决日常的计算问题。而颜色选择器、二维码生成器呢,可以让你在开发界面 ui 相关的功能时候,再也不需要切换到其他的平台。此外,工具箱还会持续扩展, 如果你有其他需要的工具,也可以在评论区里面告诉我工具的链接和学习的资料。我已经放在了评论区中,希望可以得到你的点赞和关注。你们的支持是我更新的动力,你可以把它先收藏起来,后面开发时你应该会用的上。

嵌入式开发工具介绍功耗分析仪今天给大家介绍一款嵌入式开发的常用工具功耗分析仪。 如果你做的是低功耗产品,比如互联网设备、电池供电设备,那这个工具几乎是必备的。先声明一下,这不是广告,我自己用过不少功耗测试设备,各有优缺点,但这一款是目前我用下来最顺手的。我这里用的是 the power profiler kit two, 也叫 p p k 二。 这是 nordic 出的一款性价比很高的功耗分析工具。先看外观,整体颜值还是在线的蓝色 pcb, 配合透明的顶盖和多色呼吸灯,科技感十足。但有一点我不太理解, 就是二零二四年还在出货的产品,居然用的还是麦克 usb, 而不是 type c。 另外非常值得一提的是,这款功耗分析仪的硬件是开源的,你可以在网上找到完整的原理图、 pcb 以及相关生产文件。 如果你对电流采样感兴趣,可以重点看看它里面的电流检测方案,尤其是自动切换放大档位的电流放大电路,设计得非常巧妙,很有学习价值。这款名为 p p k 二的功耗分析仪在测试功耗时,可以通过外部电源对背侧设备进行供电, 电流经过 p p k 二即可,也可以让 p p k 二直接给背侧设备供电,供电电压可以设置范围是零点八伏到五伏。 我这里直接用 p p k 二给我的设备供电。 p p k 二使用时需配合 pc 端的 n r f connect 软件,在 pc 端软件进行各种设置和电流曲线的查看,来实测一下 供电设置成五伏。打开电源,设备启动,可以看到设备启动过程中的电流变化情况, 操作触摸屏时电源也有变化,现在设备的屏幕亮度是最高,降低一下亮度试试。可以看到平均电流降下来了,但是电流的变化范围特别大, 变化细节看不清楚,很杂乱的样子。这是因为 lcd 的 亮度调节原理是用 pwm 调节背光,也就是说它不是连续变暗,而是通过快速开关背光,在时间上作占空比控制。 这时候我们先暂停一下,把波形展开放大来看,你就会发现杂乱的电流变化原来是一段一段的脉冲,对应的正是 pwm 调光的开关过程,占空比变小,平均电流也就跟着下降了。再来看一个蓝牙设备,这是我之前参与开发的一款运动手环, 在设备启动并稳定之后,可以看到电流曲线呈现出一段一段非常规律的脉冲,这种周期性的电流变化其实就是未连接状态的蓝牙。在广播 我们把波形展开来看会更有意思,你会发现每一个脉冲包其实不是一个简单的电流峰值,而是由几段细小的结构组成的。 这正对应了蓝牙广播发送的完整过程,每次广播并不是只发一次数据,而是会在三个广播信到一次发送数据,在三个广播信号之前和之后 还有一些准备和收尾的过程。上面这些 p、 w、 m 和蓝牙广播的电流细节,如果没有功耗分析仪根本不可能看到,拿到了这些细节之后,对于我们做低功耗优化是很有帮助的。好了,下期再见。

hello, 大家好,我是乐游,那本期视频我们不聊大马也不搞技术啊,就跟大家掏新窝子来聊一聊我之前进大厂之前那一段闭关修炼的时光, ok 吧, 那说实话啊,其实,呃,那个时候,其实五个月对我来讲真的就是挺难熬的,投了上百分的这个简历,被拒绝了很多,对不对?那个时候也迷茫过,但是呢,最后能拿到我自己的这一个心仪的 offer 的 话,其实我也是很欣慰的,我觉得对于我自己用的这一套学习路线,其实帮了很大的一个忙的。 那么这里的话啊,我也会分享给大家啊,大家记得看到最后有福利。好吧,那我们的话呢,主要我跟大家讲啊,学习路线总共对我来讲就是分为五个月,对不对?那首先来看咱们第一个月,对,第一个月我把它分为两个阶段,第一个阶段的话呢,就是 c 语言, 我知道有很多的这个同学啊,可能之前就是没有接触过编程,那么一学 c 语言呢,对不对啊?结构体看的眼花,怎么这里有个成员,那里有个成员对不对?但是呢,咱们 以找工作为目标的话,就一定要抓住重点,对,你像什么 if, else 这些基本语法没关系,会用就行了,你更多的就是像什么指征里面的这一些深度运用,对不对?我们的地址操作啊,指征函数函数指征这一些,以及内存管理, 对吧?包括我们的这一个结构体啊,联合体这一些是必须要拿下的,其他的一些语法你可能不太熟练对不对?但是你等到你项目我们再去给它进行优化,再去加强也是不值的。好吧,那么第二个阶段是什么呢?第二个阶段无非就是 stm 三二的一个外设了嘛, s d m 三的外设,我们要怎么去学习呢?首先从时钟开始,到我们的 g p l 外设,到中断,到定时器,到串口,到 iphone c s p i, 到最后面的 dmi。 对, 那这几个里面面试官最爱问的啊, 这都是面试官最爱去问的,很喜欢挑这些东西来问嘛。对,那至于我们会提到的什么 a d c 啊, p w m 这一些的话呢?现学现用都是 ok 的。 好吧,这是第一个月,那么第二个月重头戏来了。对,重头戏来了,为什么重头戏来了呢? r u s 实时操作系统,这个是目前企业里面用的非常多的一个技术,那我们在学实时操作系统的时候,主要啊重点的去掌握三个部分就可以了。第一个的话就是任务的一个管理,然后任务的一个通信,对,以及内存的管理。 这里敲一下黑板好不好?敲一下黑板我们是为了去找工作,所以大家千万不要一上来就去磕我们的元码好不好?要学会怎么了?要先去学会怎么去用这个实时操作系统,我们要怎么去调试,这才是最切实际的。 好吧,那第二个月我们度过了之后呢?我们就可以进入到第三个月或者第四个月了。对,第三四个月其实就是什么?就是一个 实战生化,去提高我们的开发能力嘛,在这一个阶段一定要去做项目,好吧,不要偷懒,一定要去做项目,比如说什么智能天气时钟啊,智能充电桩啊,智能门锁啊,都是 ok 的, 但关键的是一定要选对这个开发平台啊。这里的话呢,其实我强烈的推荐大家去用这个 esp 三二 c 三 对,因为现在其实 esp 三二 c 三真的火的一塌糊涂,对吧?而且还可以去干嘛?还可以跟 oppai 去做一些 ai 的 合作嘛,对不对?企业,对于企业来讲的话,目前这一 c 三也好,我们的 ai 合作也好,其实它的需求量是特别大的,所以呢,我们不要只去抱着 f 这一个 stm 三二的 f 一 系列啊,或者 f 四一系列去不放了。对,其实 f 一 来讲的话,真的是不够用的,你做学习还是可以的好吧,同时,对,同时咱们的这一个代码刷题也要跟进,对啊,也要跟进,因为能给这个高薪的企业,其实它很 他是非常去看重我们的一个代码能力的,对不对?所以我的建议呢,我们去做这种简单题和中等题,难题的话跳过,能做的肯定做,做过的直接跳过好不好?性价比太低了嘛?性价比太低了,所以不要去在这个上面耽误时间,我们把基础打牢才是玩到。 还有像什么 mcu 八股文呢,一定要给他背熟好不好?一定要背熟,那么不知道重点在哪里的同学呢?待会可以 在评论区找我要笔记好不好?好,这是第三四个月,那么最后一个月我们其实就是已经开始要准备冲刺了,对,我们做一些想这一个反复去打磨我们的项目,去优化我们的项目,对不对?优化我们的代码呀,加注是写文档,性能优化等等之类的,你去录录这种 demo 视频都可以发到我们的 github 上面, 那简历的话大胆去投好不好?不要去怕呀,哪有说你投个简历一把一下就能面试上的了对不对?这种几率真的很小,所以不要去,怕被拒绝。你去投, 投了之后大胆的去面好不好?先去面几家不想去的公司,或者说你这个想你的这一个不是有很强的这种欲望的公司去练,练完了肯定要去总结的吧,对吧? 所以说对我们来讲,其实每一次面试你能够拿到每一次的面试都是一些宝贵的经验,对吧?那如果说咱们到这里还不会的话,大家可以看一下我之前的一些视频。好吧,有,呃,之前有有专门讲过一起面试的。对,现学现卖总会了吧。 好吧,那 ok 啊,那咱们本期的话分享就到这里了,视频里面提到的所有技术文档和学习资料啊,我这里都还有存档,需要的小伙伴呢可以在评论区留言,六六六,我会一致发给大家的。好吧,最后真心祝愿大家都能够拿到心仪的 offer, 我 们下期再见!拜拜。

好,欢迎直播间的小伙伴啊,马上开始啊, let's do it。 好啊,晚上好啊,马上开始啊,开个东西啊。 哎,好,给小伙伴介绍一下课程啊, 好,欢迎,稀的可乐不多喝啊,必打巧克力。嗯,韩哥,介绍一下韩哥的课程啊,韩哥是嵌欧式全站开发就业课程。 然后呢,小黄车的一号链接,五九九,零基础,零基础能学会,那也能就业。然后呢,我们提供简历模板,然后呢是简历指导,面试指导。 呃,课程的话都是航哥一个人讲的啊,然后呢,航哥全程精讲。呃,课程十年有效期,十年答疑服务啊, 叫十年答疑陪跑。然后呢,我们有一个答疑群啊,课程方向的话分成一个单片机方向,然后呢, c 加加 q o t 上位机方向,还有嵌用式林肯的方向,然后还是老规矩。然后呢,今天晚上送五个终身会员的名额, 我们的终身会员有什么呢?呃,终身会员的话有第一个,航哥所有的课程全部免费,就是终身会员的权益的话是全部课程终身免费更新,因为我二六年会录这四个课程啊。 好,稍等一下啊, 欢迎直播间小伙伴啊,我先说会,然后你们有什么问题你们可以再问就行。 嗯,二六年的话要给大家更新这四个项目。哪四个项目呢?二六年的时候就是我们明年啊,我大概明年的话给大家更新这个应该是给大家明年给大家更新机器人相关的课程,就在我们现在这个四个项目的基础上再次扩展, 然后二六年的话我给大家升级这四个项目,这四个项目里面其实每一个项目里面都和机器人有关系,就是现在比较火的第一个项目的话是我们这是第一个项目,是 linux 的 项目, 它的 linux 项目的话是基于 eric 的 主站,主站的话我们是基于 i i g h。 这个是我们在工业控制当中用的比较多的一种方案啊, 我们是基于 r k 三五零六做的一月 k 的 主站。第二个项目的话是我们一月 k 的 重站就是电机,比如说白了我们要控制我们的电机。第三个项目的话是我们嵌式 ai, 嵌式 ai 的 话我们基本上就要讲三五八八。 第四个项目的话我们讲的是 b m s。 嗯,好,第四个项目的话讲 b m s。 每一个项目里面我们我们二六年的课程,这个项目的难度呢,是比较比较难的啊。这个项目难度的话,比如说我们以我们 e r k 的 主站来讲, 主站来讲的话我们会教大家如何设计原理图,如何设计 pcb, 然后呢如何写这个板子的驱动,就一直裁剪优步特内核文件系统,教你如何定制这个 linux 系统,然后再教你非对称多核 linux 的 驱动的开发。 最后呢我们再讲一下企业级实战项目,然后呢就是我们在我们这个板子上移植一个 i g h e r k 的 主站控制器。 这个课程已经上架了啊,课程已经上架了吧?课程已经更新了,给我们终身会员的啊,这个课程没上架,但是课程已经更新了,是给我们的终身会员更新的啊,就是你直接拍小黄车的一号链接,然后我直接这个课是送的, 就刚才这个课是送了啊,课程是送的,课程等过一段时间吧,我把这个课等我录个差不多吧,录个五十讲以后我把这个课程上架,这个课程上架单拍一个课程三九九,你可以拍一个,我的就是。 嗯,五九九的课,我送你四个三九九的项目。大概是这个方向啊, 要是早点上,你们都想要三五八八的吗?你们都想要三五八八的项目呀,是真的假的呀? 你看啊,现在是这样的啊,有的人现在啊,大家的众口不一,有的人想要早点要 bms 的, 有的人还想早点要电机的,但是就没有人要。 那个是 r k 三五零六主战呢,就是没有人要那个,哎,目前就这样,欢迎刘秀啊,欢迎可乐啊,欢迎希热啊,因赛 因斯今天依旧很开,今天依旧很开心的话,应该也是我的一个选吧。 哎,反正因为这个东西吧,大家众口难调,我也就不调了啊。这是按照先后顺序去讲吧,先讲耶克斯主战,耶克斯重战再讲。 为什么我本来要讲三五八八的啊,青菜蓝天我本来要先讲三五八八的,为什么就没讲三五八八呢?主要原因是三五八八那个板子太贵了,现在三五八八的,你再买一个三五八八那个板子市场上市场价都已经达到一千两百多了, 你说啊,你还没干啥,你光买个开挖板就要花一千两百多,这个东西很不划算。所以呢,我也就没讲了啊,这个东西确实啊,因为太贵,所以我也就没讲这里面东西 三五六八或全的三五六八的话,我你上三五六八都不如用我的三五零六啊,三五零六是三核 a 七,一点五 g 加一个 m 零的两百兆的 m 零。我讲三五六八和三五八八,三五零六和三五六八没有区别啊, 因为它三五六八只是带了一个,只是相当于来说过工业控制还挺好的,用三五六八的人很多,但是其实你用三五六八的时候呢,你还不如入一个入门款三五零六呢, 对吧?因为入门款的话,入门款三五零六也可以啊,你学三五零六一样也可以做那个方面的开发,我觉得那样也是没问题的。 嗯,这是终身会员权益的啊。嗯,给大家介绍一下我们那个课程链接啊,小黄车一号链接的话是套餐,一是全套课程一号链接的套餐,二是全套课程加全套硬件的。 然后呢就是我们的一共,像我这个现在的话,现在能出的硬件的话就是一个全站课程的配套硬件,我们的一二号链接是我们的幺零三。


逼自己一个月学完你的五一单片机水平就很牛了,存下吧,真的很难找全的。本系列课程耗时三个月,制作共计四百三十分钟,全场七小时,带你一口气从零基础入门进阶, 掌握五一单片机开发所有重难点知识。课程内容全是行业刚需,包括 i o 口控制、定时器、应用中断系统、串口通信等高频实用知识点,不讲废话,只讲重点。由于视频较长,分为六期发布,为了让零基础的小伙伴学习起来没有负担,教程中配套资料 以及我整理的全套学习资料,对零基础超有帮助的学习路径。已官加评论,我需要即可全部带走,如果你看到了这还请支持一下主播,让更多想要学习五一单片机的小伙伴看到这个视频,接下来我们开始这套系统课的学习吧。 哈喽,各位同学们大家好,我是王老师,然后呢,今天啊,我们就来开始学习我们的一个五幺单面机这样的一个内容,那我们现在所讲的内容呢,是我们的第一课啊,也就是我们的课程导学。 那课程导学呢,主要是分为我们三个篇章啊,一个篇章呢是我们所说的课程导学,一个呢,是啊,我们的一个五幺单面机,它的一个芯片介绍, 然后就是大家所会拿到手上的那一张开发版的一个介绍啊,那在这里呢啊,我们首先先来说课程导学这样的一个内容,在科学课程导学里面啊,我们主要是给大家啊,聊到三个问题,一个是我们为什么要学习我要单面机, 那另一个呢,就是,哎,在这门课当中,我们要学习哪些东西,也就是对后续课程的一个啊,简单介绍,同时呢也是给各位同学打一波积蓄啊,让大家知道你学完这门课程是可以有很多的一个收获的。 第三个呢,就是啊,你坚持学完之后,你将具备什么样的一个能力啊?这里,好,那首先呢,我们先啊,从标开起来开始,首先大家呢,呃,可能有的同学还没有见过五幺单面机长什么样子,但是呢,你在啊一些生活当中呢,其实你已经 不自觉的啊,接触过啊,当然了,他不一定是叫五幺单面机,他有可能是有可能的, 那既然这里呢啊,我们单我们的五幺单片机其实就是什么嘞?就是哎,大部分初学者开始学习单片机的一个什么,就是啊,最基础的一个桥梁。这里, 好,那我们什么情况下会有遇到哎用的单片机呢?比如说啊,我们很就是生活中比较常见的,像可能有的同学家里有那种智能家居啊,像智能窗帘啊,然后像 其实大家所用到的冰箱,空调这些里面都会有一个单片机,那为什么说我们这些地方是一个单片机呢?原因就在于, 哎,你如果说啊,想让这种可控设备啊,运动起来,就必须有个预算单元啊,去控制它, 但是如果说啊,我们直接往里面塞一台 pc 机的话,那肯定是不划算的,因为大家知道一台 pc 机它最起码呢,哎,小于两千块,那你本来一一个冰箱也才卖那么点,那这样就不划算了,那我们就会用到单片机这样的一个东西 好,他既能处理简单的一个任务,又可以干嘛呢?哎,对,我们的一个生产节约一个成本啊,这里是我们的一个啊,这个,然后我们为什么要学习五压单面机呢?那这里呢,很多同学肯定哎,会想的是,那肯定是为了以后找一份好工作吗那, 呃,我这里可以很明确跟他说,学习五压单面机呢,你肯定是不是特别好找工作的, 但是我们必须要通过学习五幺单面机去了解单面机是什么,然后跳到啊, sm 三二单面机, esp 三二单面机,那这个这种呢,它的工资就高了,可能有经常有人跟你说, 哎,学习 sm 三二,学习 esp 三二,它不需要先学习五幺,那我可以很明确的跟你说,这个种是这种想法是不对的,因为首先第一个点啊,我们学习呢,最好是循序渐进,你先会一项简单的,然后再去突破 啊。另一个呢,就是什么呢?我们在学习五幺的过程中呢,可以学习到很多的一些啊,更底层的一个操作,比如说计算器 啊,比如说啊,我们的一个就是地址,操作这些东西的,都是我们在五幺当中会经常用到的。而我们到了三二和 esp 三二的时候呢,哎,它可能 啊,就开始用到各种各样的函数啊,去进行一个操作,那这个时候呢,我们就脱离底层呢,是有点远的了啊,这里,所以呢,我们学习硬件啊,其实最好是干嘛往底层啊,先从底层开始学习,而我们学习五幺呢,就是一个啊,最 方便快捷靠近底层的啊,一个方法,像我们很多大学里面的微机课啊,其实也上的是五幺大面积啊,这里,好,然后嘞,哎, 这里也是我们的一个,那个就是原因啊,为什么要学习?首先第一个方便入门,你学习五幺的话,你可以很快速的去 构建一个小项目,而你学习 sm 三二的话呢,嗯,并不行。 sm 三二呢,你需要前去准备很多东西,比如说你需要准备很多的一个,呃,就是库文件啊,很多的一些啊,前置的一些一些知识啊,这里,所以呢,哎,我们学习五幺就是入门特别友好, 好,第二个呢,哎,就是在我们学习的学习的过程中呢,就是啊,五幺单面机呢,它相对来说 啊,它的一个计算机控制 i o 口,控制终端控制定时器串口,这些东西的相对来说要简单一点啊,不像 atm 三二, atm 三二里面呢就有很多东西啊,这里会相对来说简单点, 然后再往下面呢,就是我们的一个应用广泛啊,我们可以像很多的一些小型家电里面,其实还是会用到我们的一个 s t c 或者是别的一个八位单面机。好,这里, 然后第三个呢,就是啊,我们刚刚所说的你学好了五幺单面机,你去学 stm 三二以及 esp 三二这种的会方便很多啊,会方便很多,好, 然后就是那这门课我们要学什么东西呢?那整体的内容其实还是比较多的,大家可以先简单过一下,那在我们课间这里呢,也给大家啊去整理了一下,整理了一下,好,首先呢我们需要学习到,哎, 就是硬件的认识啊,硬件认识就是对我们的单片机啊,啊,我们的开发板啊,做一个简单的认识, 然后啊,等你知道了这些之后呢,我们再来开始搭建我们的开发环境,因为啊,我们在进行开发的时候呢,首先你得有编程环境,不然的话有句话叫做什么巧妇难为无米之炊啊,所以呢,我们先有个开发环境,好, 在这在这两个内容里面呢,我们主要是讲到了啊,了解五幺单面机的一个芯片结构,也就是我们的一个芯片介绍, 然后呢熟悉开发版啊,我们如何去,就比如说,哎,我们在这里啊,这哪个东西是什么?什么什么东西是什么,怎么使用啊?这个啊,先会给大家做一个简单的一个介绍,这个地方好,第三个呢,就是学会我们的一个 q 啊,编程环境以及下载工具,就是你要如何去进行一个编程啊,我们的一个编程环境它的一个搭建, 然后嘞下载环境它的一个使啊下载工具它的一个使用,那就会用到啊这样的一些东西好,最后呢,哎 呃,会给大家带来一个比较新的一种开发方式,就是 care 连接我们的一个 vs code 啊,这样的一个开发方式,那好处是什么呢?好处当然是 care 的 一个开发界面呢,相对来说并不美观,而我们 vs code 的 它的一个开发界面呢,要美观一点,所以呢我们这里选择 vs code, 然后啊,当大家完成了这一个阶段内容,我们就可以进入下一个阶段了,下一个阶段呢,并不会一开始就给大家来讲解我们的一个呃,什么单面机,怎么去点灯啊,这个什么的啊,我希望大家不要着急啊,我们会先带大家,带大家去 学习一下 c 语言的基础知识啊,因为可能考虑到很多同学呢 c 语言学完有那么长时间了啊,所以呢,我们这边啊就给大家先准备一个 c 语言的基础知识, 呃,如果说已经有 c 源基基础证,你觉得你学的很扎实的情况下啊,那我建议你看一下文档,如果说你都会了, ok, 你 可以直接跳到我们的 gpl 这一个章节啊,这个章节好, 嗯,然后嘞,我们啊,在 gpl 编程当中呢,我们会教大家来点亮一个啊 g led, 当然了还会教大家去讲解五啊,就是会给大家讲解我们五幺单面机里面一些啊,它自由的一些指令 啊,比如说一些左移啊,右移啊这些的一个指令啊,我会讲解这些好,然后呢就是控制我们的一个蜂鸣器啊,说分两个点,一个是控制 led, 一个是控制蜂鸣器,那啊,这一些好,学完这两个之后呢,哎,我们就开始来 学习我们的一个模块化编程啊,模块化编程让我们的一个代码更加整洁啊,其实我们后面在企业里面进行开发的时候,也一定是使用什么模块化的一个开发方式啊,这里好,就是这个。 然后呢啊,我们还会学习到如何使用我们的一个按钮来控制 led 蜂鸣器啊,来实现一个人机交互啊,这里 好,再然后呢,就是我们的一个动态数码管以及静态数码管的一个使用,那在哪里嘞?在这个地方啊,在这个地方数码管的一个使用可以在上面呢显示一些数字,比如说你想做一个体重秤啊,你想做一个什么什么的,那或者是监控环境中的温度湿度都可以显示到我们的一个 数码管里面来,好,这一个,然后啊稍等在这边, 好,在这里,然后呢哎,我们就会学习到中断与定时技术,那这里呢也是一个重点,就是你后续呢,你需要开始 s t m 三二啊,还是 e s p 三二它的一个学习呢?你就必须要用到什么啊?中断和定时 啊,这里所说的中断呢,就是处理紧急事件啊,处理紧急事件棒让我们的单面机呢,比如说,哎,当我们按钮按下,我们就去点灯,或者是啊,当外部有一些什么事件产生的时候,我们就去先处理某件事情啊,这也是我们单面机的一个优势。 然后呢就是定时器技术啊,定时器技术呢,现在你可能能看得出来的,它只是一个什么,只是一个数时间的,但是我能够跟大家说啊,定时技术呢,在我们整个轻柔行业里面用的非常多, 比如说像大家现在呢经常会看到的啊,机器人,对吧?那机器人里面有一项非常重要的技术,叫做电机技术,那其中呢电机调速啊,电机的一些控制都需要用到我们的一个定时技术啊,那我们在这里呢也会教大家去使用定时器啊,实现 计时,然后呢使用定时器实现什么呼吸灯以及播放音乐啊,这里我们用到的是 pwm 这样的一项东西。 好,然后我们就给大家讲解串口通讯啊,串口通讯,那串口通讯呢,也是我们对于啊学习后面 sm 三二呢啊,或者说大家后面以后工作了啊,都是不可或缺的一个点 啊,因为我们后面大家所接收到的传感器也好啊,什么什么东西也好的,或者是个上位机通讯,比如说我们这里写了啊,学会串口的通讯原理,让单面机能够与电脑 以及其他设备进行一个数据交互啊,通过啊,窗口中断,哎,实现什么数据的一个说法这样的一个事情。好,这里啊,然后嘞啊, 第三个就是,哎,我们当你学完这个五幺之后啊,也就是我们这一整个内容之后,你会你会收获什么东西呢?哎,这里的话,首先,嗯,你会具备一个什么?具备一个 单片机软件和硬件的一个搭建,呃,就是呃,软件环境的一个搭建,然后呢硬件的一个基础知识啊,在你的脑子里面会具有这两个。好。第二个呢就是,对啊,能编写 c 元代码,那这个呢是肯定可以的,因为我们等到后面的时候都是在编写我们的一个 c 元代码。 然后第三个呢啊,能够使用中断定时,串口啊这些的一个技术,完成我们的一个小项目。第三个呢,哎,在你后面学习呃,我们的一个 s m 三二大面积的时候呢,有 为后面打下一定的基础。那这里呢啊,我们所说的中断定时以及串口等技术呢?都是啊,在 sm 三二当中有同样的技术点啊,有同样技术点,也就大家可以这么理解, stm 三二,它是 stc 啊, 五幺单片机的一个什么超级啊,它包它里面的功能呢,包含了这些。好,那我们的一个课程导学呢,就先给大家聊到这里,然后呢我们下节课呢就开始我们的一个芯片介绍以及开发版的一个介绍啊,好,谢谢各位 啊,好在刚刚呢,我们已经把 c 语言基础啊,已经给它讲了一下了,那现在呢,我们再来讲一下我们的 c 五幺里面啊,它的一些特有的关键词和实体啊这里面, 那我们这里呢它这个关键词呢分为两种类型啊,一种呢是我们的一个存储类型的,就是它可以作为啊,就是设定它的一个 存储啊位置这样的一个东西。第二个呢是作为一个特殊功能的一个关键词啊,其实他们都是给变量用的,只是说呢啊有一有一定的一个区别,那这里呢其实大部分呢我们并不需要过多的去, 就是一定要说知道每个地方呢我一定要用到它啊,并不是说我们一定要用到它,而是什么呢让大家知道有这么些东西啊,你在写的时候呢就不要去,就是或者说看到别人有这个东西就不要去惊讶啊。首先呢我们先看到第一个雷塔这一个 那经常有小伙伴呢,可能如果说有些小伙伴已经写过我们的一个五幺单面机的话,万一你在程序里面啊,比如说我们来看一下啊,假设你在程序里面写了个 int data, 好 等于零,好, ok, 那 我们来看一下啊,编一下会发生什么情况呢啊?会告诉你这里呢有问题啊,那这是什么原因呢?因为这个 data 和它重名了,比如 data 杠一,好,我们先来 变一下,是不是就没有问题了,所以这里呢是因为它重名了,那所谓的这个 data 呢是干嘛用的呢?哎,它的一个作用啊,和我们那个 就是 c 语言里面啊,就是有一个关键词叫做计算器存储啊,是有点相像的,也就其实这边其实也都是计算器存储,它的主要作用是干嘛呢?是让我们对这个变量的访问速度变得很快啊,这个,那我们这里呢,它是放在什么啊?放在 啊 rom 的, 也就是我们运行内存的前一百二十八笔啊,就是一百二十八位中啊,然后呢这里呢放在二百五十 啊,二百五十六位中啊,这里,然后嘞啊,这里就是这两个啊,就是 data 和 i data 啊这两个东西, 然后嘞比特塔呢?是啊和 xita 这些呢,其实都是属于什么?就是一个是位置位寻啊,就是我们的一个位寻值区,然后嘞还有外部啊 rom 这样的一个,就是你用,你如果说你用到外部的一个存储空间的话,那我们就可以用到这一个 xita, 就 一定要用 xita 去进行一个存储, 那其实就是比如说万一你加装了 sd 卡或者啊 rom 芯片这样的一些东西的话, ok, 那 我们就可以用到什么 xita 啊这样的一个, 然后还有我们的一个啊, pdf 也是一个外部的一个寻址,那这里呢,它的一个区别就是什么呢?啊?就是哦大小啊,这个地方好,然后呢就是我们的一个 code 啊,就是 程序处理器用来查找我们的一个程序的,不过呢啊,大家需要知道是这一块呢,其实主要大家是需要做一个了解啊,做一个了解那啊,我说了这一块是做了解,那下面这一块呢,大家可能就要知道怎么去用了,那我们首先呢,先来看一下啊,首先我们先看到第一个啊, 第一个啊, sfr 啊,这个呢,其实大家就会看到了啊,我们现在就让大家来看到这个东西,那在这里呢,我们 open 打开一下,诶,这里就会有 sfr, sfr 呢,就是去定义一个 p 零等于 x 八零,就代表诶我们 p 零所在的位置呢,就是 x x 八零。 如果说你想啊,你想自己去定义一个什么 led 啊,等于零 s 八零,也是可以用到这个 sfr 的 这样的一个东西。那,但是我们正常情况下不建议这么操作,我们一般怎么呢?我们一般用前面的啊,那个什么 define 啊,去将 p 零映射为 led, 当然了,我们其实是用的 p 一 啊这样的一个方式。 好,这里啊,这是我们的一个啊,就是 sfr, 它的一个作用是将八将地址写入到我们的一个啊变量中。好,这是第一个 sfr 这样的一个说明。 然后嘞,还有 speed, speed 呢,这个这个东西是我们用的比较多的,我们等一下就会用到这样的一个东西啊,比如说我们需要将某一位啊,某一位,就比如说我们需要将啊 sbit 杠一好,等于 p p e 上键号零啊,我们可以这样去做。这种方式呢,代表什么呢?将 p e 上键号零啊,给它取了个别名,变成了什么 l d e 这种方式。好,然后呢,这个 sfr 十六,那在我们要学习的这款芯片里面其实是没有这个的,因为它是什么十六位啊,大面积好啊,还有这个啊, it 的 it 这个是干嘛的呢?是作为一个中断服务的,在我们后面呢也会讲到这个东西,就是我们这个中断服务的一个声明。 好, uonside 呢啊,这里呢是对于上面这一个 it, 它的一个中断服务函数声明的一个啊,扩展它用的什么呢?我们这里可以看到啊,首先呢用到一个就是中断中断服务, 然后嘞用到了某个计算机组啊,这样的一个操作,这里好这个地方,然后我们再往后面走呢,这个的话,其实就是啊,指定变量的一个绝对地址,让变量呢啊锁死在这个位置。好 啊,它的作用是什么呢?好处就是,哎,我们可以去对我们的一些存储空间进行一个编排啊,这样会让我们存储空间更加的紧紧密啊,这样会有它的好处, 那这里呢,我们其实主要需要关注的啊,首先呢第一个 it 啊,这个中断的服务函数需要关注一下,然后 speed 也需要关注一下,还有什么嘞? sfr 啊,这里呢也是我们需要去主要关注的啊,这几个点。好,那等一下呢,我们也会带大家去用到 speed 这里呢啊,大家,其实啊,在学完这套课程之后啊,你也会对其中的啊一部分关键字做一个了解,那如果说啊,有些同学说,哎,老师,那你其他关键字没用到,那怎么办呢啊?没用到就是没用到,那如果说以后用到了,你可以跑过来来查一下, ok 吗?好,那我们这一个呢到这里 好 ok 啊,恭喜大家在前面的 c 源啊,已经学完了,前面的 c 源基础啊,以及我们的环境啊,还有这个特有关键字这些的啊,已经学完了,那我们现在呢啊,就开始来学习我们的一个 led 点灯啊,这样的一个实验。 那在这里面呢,我们主要啊给大家讲解的呢,是如何通过我们的一个单面机点亮我们的 led。 那 首先我们要进行的第一步啊,就介绍什么是 gpl, 那我们这里呢 gpl 就是 单片机上面的输入输出接口啊,后面大家学习到三二的时候呢,也会接收到这样的一个东西,那作为一个可以输出高低电频啊,也可以读取高低电频的一个工具, 那高低电频呢啊,是对于单片机的工作电压来讲,那比如说啊,我们单片机的一个工作电压是五伏,那我们高电频为五伏,低电频为零伏啊,这样的一个操作。 好,那这里呢,首先啊,我们要对我们的 led 灯进行一个远利图分析,也就是啊这样的一个东西,好,它总共呢是八个灯啊,八个灯刚好对应我们啊,八个位好,刚好对应我们的单频机 p 一 啊,零到七啊, p 一 零到 p 一 七这样的一个啊 东西好,那么啊,我们现在就需要来把这几个灯给点亮,那现在呢啊,我们先回到这里面,好,我们来看一下点亮这几个灯的方式有哪些。这里是最前面给大家建了一个框架,我们就给它直接关闭啊,关闭掉点击试, 好,我们现在呢重新来新建一个啊,新建一个,那这里呢就是我们的零二 啊 led, 好, 这个才是我们正式的,前面呢是一个啊,就是模板啊,模板是 工程模板,模板 ok, 好, 他可能还不准我改啊,好,那不改就不改吧,我们先到这里面来,然后呢 mv 好, 保存好,这里呢?还是这样的选择, a t 八九 八九 c 五二。好,选择它,点击, ok 啊,需要启动文件,但是其实你要与不要也都还好了,大家一样的啊,点击新建一个, 我们点下保存啊, ctrl 加 s, 我 刚按了 ctrl 加 s, 好, 那我们在这里注意哦,现在是在刚刚你的那个工程路径下面,你得回到什么?第二个,这个地方是比较容易坑到大家的一个点啊,大家需要注意一下,点 c 啊,写写入点 c, 点击保存 好,这样就可以了。然后呢?啊,这里是这边,完了,你右键看一下,现在是没有添加那个什么 i g 五二点 x 那 个东西,那是因为你还没把它加到我们这个 source group 里面去。好,那我们在这里双击啊,双击它,好,那么此时此刻啊,你已经有了,来,点击这一个, 好,这里。然后现在呢,我们已经有这样的一个头文件了,我们就可以来写一下这里,我们现在可以用 v i d 了,其实大家用什么都无所谓了,是 m n, 好, 括号摆下来。 好,那我们首先要写的第一个呢,就是点亮啊,通过什么?通过 s b i t 啊, 点亮 led。 好, 还记得我们前面学的函数吗?那我们现在通过啊,不,一个个函数来解决这样的一个事情,来分类,好啊,给大家分类好这样的一个东西。好,这里来, 通过 s b i t 啊, 点亮 led, 好, 这样的一个操作到这边,到这边啊,稍等,这里。 ok, 好, 然后呢,这里呢?如通 s b i t 是 怎么操作的?我们需要通过 s b i t。 好, 然后呢 led 啊,这里是自己命名啊,你只要不是中文,它的命名方式是这样的, 就是啊,英文大小写都可以,然后呢,也可以是下划线,也可以是数字,你只要不要第一个是数字就行啊,这里啊,这里的命名其实就这三种组成啊,等于什么呢?等于 p 啊, p e 上键号啊,按住 ctrl 在 键盘上面的六啊,就打出来了这样的一个上键号,然后嘞零好,此时呢就相当于把 led 给命名,命名了一个名字,那我们呢,操作的时候呢,就是啊,我们可以怎么做呢?来看一下啊,像我新建一个 mei d, 我 们的一个 demo, 对 吧? led sim 框。好,那我们呢就可以来点亮我们的 led, 将 led 等于什么?哎,我们来思考一下,它到底是等于零还是等于一呢?在这边我们也可以看到它 p 一 零啊,那肯定是什么,那这边啊 啊,我们可以看到单边,这里的一边引脚接到的是 vcc, 那 这边呢,肯定是我们要需要接到什么让它点亮,肯定是要等于零的。好,那现在呢,我们就已经啊,其实我们就已经做好了,来 编一下,那编一下,其实还没完啊,我们还发现还有问题,就是这一个呢,我们还没有调用啊,这里报了一个十六,十六的话,意思是说,哎,你建立了某个函数,但这个函数没有去使用,那我们就先来使用一下来,我们在这边呢调用一下来某他啊,这样就是函数的调用啊, 输的调用, ok, 好, where 一。 好,这个是,这里要写个 where, 一 是干嘛呢?这个是防止程序跑飞啊,防止程序跑飞,这个 跑飞啊,因为呢程序一直在高速的运行这个梦函数啊,就是你如果说你没有这样的一个防止它会哎,结束掉又重新来,结束掉重新来,那这样就把我们程序就 跑的不知道跑到哪里去了,所以我们不要这样啊,就是我们要加一个 where 啊,这样的一个方式,然后再编一下,那现在呢啊,如果新手朋友肯定就已经踩坑了,为什么这么说呢?你来看一下啊,在这里 好,在这个地方呢, c 语言啊,不不不不,不,教学工程啊,这里面这个地方呢可能会已经踩坑,因为你看啊,这里是没有函数文件,所以呢,我们是不是得干嘛到这边啊?来,来这里勾选一下,点击确定。好,那我们在这里呢运行 好,我们再来看,此时是不是已经有函数文件了,那现在呢,我们就可以通过这个来找到啊,我们的一个什么呢 文件,那先先扫描一下啊,这里也都没有选错,打开文件,那么会得往上面走一下啊,找到 led 好, opcode 到这里面来好下载,但是呢现在肯定是不会找到芯片的,因为我还没有去给它上电,那我们打开相机 好哎,稍等一下,然后呢我们可以看到啊,现在的话呢啊,就是这样的一个来我们商店好,那边呢,就已经开始进行一个烧炉了啊,在这里 我们可以看到,那稍路进去之后呢,我发现是第一个灯亮了,对吧,那现在呢,我们想办法让第二个灯来点亮,我们来看一下啊,到底怎么来操作好,那我们点亮第二个灯呢,我们只需要干嘛复制一份啊? ctrl c 啊, ctrl v。 好, 到这里呢,把一改成二,把零改成一。好,那此时呢,把二 复制粘贴下去,等于啊零。好,这里呢我们就可以等下就可以开始编辑了。那在编辑之前我们先来看一下,现在是一个灯啊,我们先截个图给大家看一下,没搞好,是 我们可以看到啊,这里现在是截了,是亮了一个灯啊,就是现在是只是亮了一个灯那,呃, 那么现在呢啊,这样我们就需要来点亮第二个灯,这里呢啊,需要注意了,这个现在是中文,我们得把它切成英文输入。好, ok, 这里呢就已经零警告零错误了,我们这边呢只需要点击下载就行了,或者呢其实这里有一个当目标文件发生变化时,自动装载并下载,我们其实选择这个是最好的,当然了他其实还得重启一下,对我们来说好像也没有什么太大的。 那个我们可以看到此时此刻,嗯,可以看到是两个灯啊,两个灯已经亮起来了,这里两个灯,那我们还可以看一下三个灯,或者是我们直接把七个灯全部都亮起来。 好,这里呢我们复制一下上面,这里是一二三四啊,一二三四,好,还差两个,那这里呢是三四五 啊,六七八啊,这里是二三四五六七。 ok, 那 现在呢,我们把这个呢啊,好,给它整体复制一下 三四五六七,然后呢是他的一个第八个这样的一个操作。好,在这里呢我们把这个那就直接复制吧,这个啊,一个个写的话,那确实挺费劲的来,好,那我们现在呢来见证奇迹的时刻啊, 好,到了,那我们来看一下这边呢,其实已经准备下载了,但实际上有个问题是他必须要手动下载啊,这个其实是有点那个。好,那这里呢?哎,我们可以看到八个灯都已经被我们点亮了,那恭喜大家,现在已经已经跨入啊嵌欧式 啊,青口子工程师学习的第一步了,你已经点亮第一个 led 了啊,非常棒啊,给自己点掌声。好,那么啊,我们往后面走啊,往后面走,现在是点灯的第一种方式。那还一种方式是什么嘞?通过什么?通过十六帧啊?通过十六帧, 通过十六帧 禁止。哎,等一下。好,十六禁止来点亮第一个 id 那, 哎,在刚刚呢,大家已经发现有个问题了,这个要写这么长对不对?哎,你如果说你不想写这么长怎么办嘞?好,那我们有个整位操作的方式,这个是 demo 一, 我们给它改一下啊, demo 一, 好,就这样。 demo 一, 那注意哦,你在这边改了之后你下面也得改哦,这里啊,也得修改一下。好,那这里呢,我们复制一下这个 demo 一, 我们把它变成什么 demo r 啊,这样来做,然后呢到这边。好,那这里呢,操作方式就比较简单了啊,我们刚刚知道了,它是 p 口对不对? p 端口它可以直接去复一个啊,两位的十六英寸,两位十六英寸,它总共呢表示多少个零呢?我们可以来用计算器来算一下就知道了。 好,在这里,那找到这边这个程序员。好,那这里呢,我们来看一下两个啊,找到 hex 十六金字码对不对?比如说啊,两个 f 它代表的是多少个 e 嘞?哎,是不是刚好是八个?所以呢 啊,我们可以通过零 x 零 x 零零的方式,这样呢,我们的所有人就将会亮起来。好,我们来看一下, 好,这里呢,下来,现在呢,我们把程序给它下进去了,这里还是一样的,它得手动重启, ok, 是 bug, 灯已亮了,那这个时候呢,如果说你只想点亮一个,那也很好办,来,拿出你的这个计算器到这边来,比如说你只想 点亮其中某一位,那这个时候你只需要输多少呢?输入啊,我们的一个零 x 幺零即可。让我们来看一下零 x 幺零,看一下是第几位啊?是不是我们的第四位。来,我们啊,来看一下,第四位。好,看,这效果来,现在呢,还是这样了, 好,哎,稍等一下,这个程序好像是还没下进去啊。好,我们来下进去一下。 好,此时应该下进去了。哎,还在等,还在找,是吧,来重新下载一下。 ok, 好, 那,但是呢,这里我们发现还是没有变化原因,是啊,刚老师出新了,我们应该是把这里改成这个。好,来,好,那我们来看一下,现在呢,我们再来下载一次。 a, 啊,这里呢,我们刚刚的方式是什么嘞?是将这里点成一,对不对?那这里点成一,就是这一个不亮,那我们先把它点成零,然后把所有的都干嘛?其他都点成一的话,那此时呢,就是啊,只亮这一个,只亮这一个。来看一下, ctrl c, 然后呢,放在这边啊,零 x 零 x e f 啊, e f。 好, 那我们再看一下来, 好啊,我们现在呢,此时此刻他只点亮了一个灯啊,他只点亮了一个灯,我们从这边数,是不是第四个,对吧?好, ok, 那 这个呢,是我们的十六进字点灯的方式,大家可以通过这个算十六进字的位啊,去来做这个也是蛮方便的。那现在呢?是我们啊来做这个这些东西的, 那我们来看一下,此时呢,我们想做一个网络上哎,比较炫酷的一个操作,什么呢?流水灯,对不对?那想做流水灯呢?我们来想一下,构思一下,是不是 啊?构思一下,那想做流水灯它需要哪些东西呢?首先第一个是不是要能点亮灯?可以点亮 灯啊,这是第一个事情。好,第二个事情呢,我们来想一下流水灯那个操作是什么?可能是他比如说他这样的,先亮第一颗,再亮第二颗,再亮第三颗,再亮第四个这种方式来亮,那用这种方式呢?我们就会有一个小问题,什么呢?哎,就是他有, 他需要有一个时间间隔啊,需要一个时间间隔。那首先第一件事情我们是不是已经 可以完成了啊?已经可以完成了。那第二个呢?需要一个时间间隔的话,那这个其实我们现在没完成,他其实是需要什么?需要一个延时函数啊,需要一个延时函数。那这个我们怎么来获得呢?其实很简单,大家打开这一个, 这个啊,我们的一个 s t c s p 这样的一个东西,好把它拉宽,拉宽一点啊,当然了,可能你的屏幕没有这么宽,那也没关系啊,你可以干嘛呢?你可以挪这样子点一下,那点到哪个呢啊?我把它拉宽一点,这样也方便,有些东西好找一点。找到啊,我们这个软件延时计算器点上它 在这里面呢,我们点击啊,就是首先呢输入我们的赫兹,那我们的赫兹这个东西你怎么知道呢?你看金正上面啊,金正哪个位置啊?给大家看一下, 当然我这摄像头肯定是不会给大家看的话,是看不清楚,这个地方,上面写了幺幺五二零零。好,你去看它就是了啊,这个地方,那然后呢啊,你最开始的纸巾机可能是选择 y 五,但是呢我们来看一下有没有匹配的啊? stc 幺五 f 叉叉啊, stc 幺五 l 叉叉啊,不是我们的对不对?我们要的是我们来看 y 三是不是? y 三,好像也不是来看 y 一, y 一 呢,就是什么 s e c 八九 c 叉叉,这个就是我们想要的叉叉呢,代表任何任意数。好,那下面我们点击生成啊,生成, ok, 那 生成之后呢,我们可以看到啊, 有这样的一些东西啊,那就有一个底类,一毫米,那刚刚这里为什么是底类?因为我改了,改成一毫米的。什么 啊?那个,那当然了,你也可以改成十毫米啊,多少毫米都可以,那比如说我们可以干嘛呢?比如说我们需要一个十毫米,十毫米来,或者是一千毫米,对吧?我们让我们的灯啊,这样吧,我们让我们的灯五百秒,五百毫米闪烁一次,也就是半秒钟闪烁一次。复制啊, 然后在这里黏黏贴一下。好,那我们等下让他来那个来闪烁,那这里呢啊,我们复制一下来,放到放到后面来,那这个地方啊,为了我们的一个程序啊,好看一点,我们给他干嘛呢?给他提到最上面去啊,最上面去,这里我们写一下啊,写一下延时函数,在这边复制 黏贴好,延时函数 好,那我们等下只需要去掉它就可以了,然后呢?啊,我们来看一下,等下很,等下其实会有个小问题啊,但当时我再告诉大家怎么解啊?这个地方,好,这里,嗯, 好,这个,这个可以删掉了。我们先,我们先啊, led 闪烁啊,这里好 控制 led 闪烁啊,然后呢我们来看一下啊,怎么来控制这个东西好, 还这样的,我们复制个 demo, 那 demo 三对不对? demo 三好, demo 三呢,我们来看一下 led 闪烁,它是不得在一个循环里面去跑啊,对不对?那所以呢,我们这里呢就需要一个什么,我们这里就需要一个 v i e 循环了,但是呢,那如果说在写真正的程序的时候,我不建议你这么干啊,就是你,你不进,不,不是,不是说不建议你这么干, 是不建议你在其他函数里面随意的去写 v r e, 因为这个我们现在程序量少,我们是可控的,但是如果说后续程序量多的时候,你这个 v r e 一 写,你就不知道到时候它什么时候飞进来了啊,所以呢,那我们尽量的 就是在后续开发当中我们就不用 v 二 e 了。好,那这里呢,我们来想一下,让 led 灯闪烁起来,那首先是不是先让它亮起来?亮好,亮起来啊,亮起,好亮,然后呢再让它干嘛?灭吧, 呃,这种方式, 呃,然后在这里呢,我们 往再往后面啊,是不是?然后呢?中间我们是不是要时间间隔?那这样的话我们就是什么这样,然后就是延时, 延时, ok, 好, 那首先呢,我们先让它亮起来,亮的话我们是不是现在已经很快解决了?屁,零等于什么?零 x, 哎,我们都说零 x, 零零是不是还亮起来了,整个都亮起来,对不对?然后呢,灭呢?是怎么办呢?灭了就是什么零 x, f f 好, 全部都等于一,它就灭了,然后延时呢?我们是不是在前面有个什么啊?有个五百毫秒的底内五百,那我们复制到下面来,走,五百毫秒。好,好, 不需要填任何参数,你直接把它拿过来,这里也是这样的,拿过来,大家注意啊,在写程序的时候尽量啊去复制,尽量去复制,不要去啊,手写好啊,因为你手写很容易写错了。 好,那此时呢告诉你,哎,这个 note 这个东西呢有问题,那其实呢,大家可以把这个删掉,或者呢加个什么啊,加一个头文件啊,再给大家的这个课间里面我已经准备好了啊,就是, 呃,这个 instagram 啊,这个函数,你加上它啊,其实也可以,那等一下呢,我就给大家去着重地介绍一下这个啊,好,来运行一下, 好,这里啊,然后呢,现在是 l e 十六这几个没有去使用,那其实这个是没有关系的啊,这个是没有关系的, l e 十六我们很多时候会给大家去禁用掉,因为说的是有些函数没有去使用,那在这里呢,也可以给大家讲一下怎么去禁用,在魔法棒里面啊,有一个 l b l 五幺这里,然后呢有个 disable warning numbers 这样的一个值,那我们给它十六好,点击, ok, 然后呢好编一下,那是不是就没了,对吧?好,那可以了,那现在呢,我们再啊,编完之后呢,我们就可以进行一个下载了,在这里呢,好,还是一样的啊,我们得重启啊,我们得重起来,在这里, 好,哎,可以看到我们的灯是不是已经闪烁起来了?那现在恭喜大家啊,已经完成了我们的 led 灯闪烁,那接下来啊,接下来我们就需要干嘛呢?就需要进行我们的一个 led 流水灯这样的一个操作了,那复制这里啊,复制这一份到这边粘贴 led 流水灯。 好,流水灯,那啊,当然了,可以大家可以实现这个流水灯方面有很多种啊,比如说我先要一亮,然后这样这样一密二亮,对不对?那这个太麻烦了,对不对?你是不是写很久啊?那我们这里呢有更简单的办法。有什么办法呢?在刚刚 给大家讲的这个什么 an 啊, in into 这一个啊,这个里面呢,它有一个函数叫做循环左移和循环右移,但其实它的作用是什么呢?它作用是这样的,我给大家讲一下,就是,呃,是这样子的, 零零零零啊,啊,不对,我们我们其实设置是幺幺幺幺幺幺幺零啊,我们先设置一个这样的初值值,然后他后面会干嘛呢?他后面会让这个值循环起来,就是让他变成什么啊? 幺幺幺幺啊,幺零幺,好,最后呢就是他运行一次,就让这个零呢,往啊往一边靠一下,就比如这个呢,变成什么啊?复制粘贴 c 啊,这 ctrl x, ctrl v, 好 一个个去循环,那我们现在其实你就已经可以看到它是不是就是个流水灯了,对吧?那我们现在呢,来简单介绍一下这里面的一个函数,那这里面呢,我们简单作为,首先大家先看到第一个 logo 啊, n o p 啊这样的一个东西, 那这里呢是一个什么?空操作,空操作,当然了大家其实也可以干嘛呢?我只把它代码复制过来了,大家其实如果说你想看原码的话,也在这里面也有这个地方。好, 然后呢这个是测试为变量,测,什么叫测试啊?测试为变量呢?是这样的,你把你的一个,比如说 led 这样的一个位置填进去,他会给你返回一个,就是看你里面到底是零还是一,那其实这个呢我们其实用不到,你这我们可以直接读的,这个东西好往后面走啊,往后面走,就是啊, 这个呢是我们的一个循环啊,右移,对,然后呢下面一个呢是我们的一个什么循环的啊? 也是一个循环语言,但是要注意这个是 c, 这个是 i, 他 们之间有区别。什么?这个是十六斤啊,这个是八斤子的,这个是十六斤子,我们这个是不用的,这边呢是我们循环左移啊,这个地方。好,那 呃,这里啊 l 的 话稍等啊,这里,不对不对不对,不好意思给大家说错了,这个地方它是为了兼容性的话,有点小问题,它是这个的话是我们的一个,给它写一下吧,我一下给 啊给自己绕进去了,不好意思,各位啊,幸好没有到后面去的时候才意识到啊,那这里呢是一个什么八位的啊?八位的,这个呢是个十六位啊,下面是三十二位,那其实呢后面两个我们都用不到,所以呢我们总共用到就什么就是第一个以及什么啊以及 啊,下面一个就是 c r o r 啊和 c r o l 啊,循环,这个是循环右移,这个是循环左移,那干点这样的事情,那然后呢再到后面呢,其实就没有我们什么太多事情了,这里面就是一些啊,就是 它的一个地址的一个操作,我们我们现在主要用到这个 c r o r 和什么 c r o l 这两个。 ok 啊,各位,那前面呢也给大家说了一下,就是这一个这个东西,然后现在呢我们来开始写我们的流水灯,那至于为什么刚刚就是一下子就断掉了,是因为我后面看了一下,就整体代码写的很长。 那这样呢,其实不方便大家的一个学习,所以呢我们啊就新建,另外新建一个工程,然后把那段视频就已经截掉了,那我们现在呢来重新啊,是点亮 led 对 不对?那我们先增加一个,这是什么 啊?就是或者呢直接复制一份啊,复制一份这个呢叫做 led 流水灯。好这样的一个操作,然后呢第三个。好,那来我们开始第三个,我们先可以把这个呢啊给打开一下 啊,那这里呢就否吧,我还是否一下,然后在这里新建,回到零三 led a four。 哦,我是新建哦,我应该是用 open, 不好意思啊,那我们回到第三个流水灯,第三个打开它,然后这边呢大部分呢我们可以删掉一下了,这里呢我把它给删掉啊,这里这两个就不啊,这个保留,这个保留,这个后面,后面可能会需要到, 然后这里呢啊,我们就把这个颜色做一个修改,现在呢我发现是不方便使用,那两个你不能自己调,对吧?那删掉啊,这个删掉啊,怎么来调呢?很简单,把这个 m s 删掉,我们加个什么 onside 六 n, s, i, g, n, e, d 啊,这个,这个是无符号啊,无符号就是没有小数部分啊, into, 然后呢,增加一个 啊 on, 那 个什么 x ms 啊,就是叉 ms 这样的一个方式。好,然后嘞,这里不是有个 do where 吗?那我们其实这里就是延时一毫秒所用的时间嘛,那我们这怎么做嘞? where? 好 多少次叉 ms 次啊,你要多少毫秒,你就在这里填就是了。然后它这个呢去循环地跑这个部分啊,跑这一个部分,我们把这个代码给它做一下修改就是了。啊,这里我应该是要用到什么 ctrl 加 x。 好, 这里 好,这样来,这个, ok, 那 我们现在呢来告诉你啊,然后我们可以看到这里有一个啊,这里有个小问题, l 一 和 l 二。那这里大概是一些函数设定的时候有有点小问题,我看一下 demo 四啊,这里 demo 四说明这个没有啊,没有了,我们把这个先删了,可以了,好,有定义,但有,有使用,但没使,但没有那个。好,那我们这里先做个小实验,看能不能用啊。这个好, delete, 我先下来点一下,比如说我要进行个五百啊,你就写个五百,后面就可以了。然后呢, l d 啊,来等于零。好 啊,复制下来粘贴好等于什么?一好,点亮和熄灭啊,我们做个这样的操作,然后呢,把这里呢要换一个位置了,打开程序文件,回到上一集,回到上一集这个地方。好,来下载一次啊,下载, 好啊,好,这样下载一次。 ok, 稍等,这里好像, 嗯,看一下啊,这个修改是不是有问题? ms 啊,这里少了东西,我们没有进行一个 ms 剪剪啊,我发现它没有闪烁,因为我们增加个 ms 剪剪好增加到这里,这个地方,因为它每次进来都要减一嘛,好,这样的一个方式来做个记录啊,好, 好,那么此时此刻呢,我们的一个,哎,等一下啊,这个灯啊就已经在闪烁了,就代表这五百毫米是可以的,那如果说你想要更长的一个时间呢,给咱们做个修改,比如说,呃,八百, 好,这里呢啊,不更长,其实看不出什么,我们短一点嘛,一百啊,我们整个一百和一百,来,一百,好,保存一好,到这边呢,来,我先回到这里。回到这里什么情况呢?来, 好,闪的快一点了吧,对吧,所以这个延时函数暂时没问题了,大家可以按照这个方式去做一下。修改好这里,那然后呢在这边好,在这边呢我们就可以来进行一个延时函数的编写了,那我们这里就只写啊,不对,流水灯,流水灯那个编写好,流水灯 好在前面呢,我们讲的我们流水灯需要用到什么,是不是需要用到我们的什么 c t i 啊, c r o r 啊,这样的一个就是循环右移啊,循环右移,这里写到下面去,我写到下面去啊,我把那些代码删了,就是为了方便大家的一个观看。 好,右移好,然后呢复制一下,这里呢是我们的 c i o l 循环左移啊,循环左移, 所以好,在讲这两个函数之前呢,我们先讲下它的一个返回值和参数啊,首先呢啊,返回值啊,它的一个首先是它返回值啊,那宝贝首先是它参数参数啊,参数 参数好,参数呢?参数一啊,要操作的数据。好,参数二啊,单次操作, 操作所移动的位数位数。好,那比如说我们填个一,那就一次每次移动一位嘛?啊,大家要操作数据呢,就比如说啊,你最开始是什么?零 x 啊?零啊,对, f 一, 对吧? fe 啊,这样一个方式,那就是什么一 啊?零零零一啊,好,那你进行一次操作就变成什么变成这样了啊,只有一个这样的操作。好,这里啊好,返回值。什么呢啊?返回值,返回值啊,操作完之后的数据, 操作完成之后的数据啊,这是第一个这个东西,那我们这里呢其实就是做一个什么呢?就比如说啊,你,你已经一一一, 你,你已经得到这样的一个数据,然后你要把它复制啊,复制出来,那这里就是什么?就是它的返回值,这是它的一个操作。那这里呢,我们写两个 demo, 一个呢,单纯啊,单纯循环 左移啊,和一个什么啊?就是啊,双边就是呃循,呃,双边循环,双边循环。做个这样的事情在这里,那我们这里就是啊,先给我们写一下,做个这样的事情,就是先循环左移, 左移,再循环右移,好,做个这样的, 这里放啊,没有 id, 好, 那就 demo 一, 对吧,好,这样做这样的操作,然后呢到这里就是什么没有 id, demo 杠二,好, 好,这样两个事情,那首先呢,我们 demo 一 的话,主要是做一个,就是它的一个巡,就是移动,那我们这里呢啊要做一件这样的一个事情,大家需要注意,首先呢我们要做的第一个啊,就是什么嘞?就是要 定义一个变量来存储它的一个什么,这个循环左一个循环右一的值,那这里呢,我们可以定一个啊, u n c g n e d 啊,哎, u n s i g n e d 啊, g n 啊,这搞错了,好,这里啊,这个是干嘛呢?这个是啊,无符号啊,无符号,各位啊,这里是无符号哎,要不要 in 呢?是差了一些,我们是一个八位的,对吧?然后呢啊,是一个什么 led beta b i t b i t 等于啊,我们初使呢,应该是零 x, 什么零 x f e 啊,为什么是这个值呢?其实大家也很好理解啊,零 x f e 呢,就是什么啊,一一一一零啊,这种方式,这个 好,对,然后呢啊,我们现在呢,还需要干件事情,这是初使值,初使值啊,这是第一件。然后第二件事情呢?是啊,熄灭,熄灭所有的, 你肯定要把先把它所有都熄灭掉嘛,最好是一个初值,对吧?啊, p 等于什么?零 x f f, 对 吧?赶紧这个事情好到这里, ok, 这个我们搞完了否循环啊?不,不用否循环,我们用什么 where 啊,这样的一个循环 where 一 来到这边来,好, where, 一 到这边来之后呢,我们首先啊,可以让我们的 p 一 去,等于什么?等于它啊,等于它。 好,这样我们是不是就,哎,第一步是不是就点亮第一个了,然后呢,用它去接什么?比如说我们现在是不是要进行什么循环左移,对吧?来,我们拿到循环左移的函数到这边来,然后呢,我们还记得我们第一个参数填什么吗?各位啊,第一个参数是不是填我们的?哎, l d b 啊,这个地方好,移动移位, ok, 干成这个事情,然后啊再往下面走, bet 就 会啊,啊,这里的话我们就再延时,对吧?再延时一下,比如说啊,拿到这个 好,拿到它就直接进一个原石就可以了,五百好干这个事情。好,那现在我们把 demo 一 拿到什么注意哦, demo 一 放到外面啊,放到这边,那放这边就可以了,因为我们外面是不是写了 vr 一 对吧,好,这里啊,好 好,这个我们都删掉 demo, ok, 来,好,这样呢,我们再开始进行,我们的一个就是烧录。 好,那此时此刻呢,大家已经可以看到它正在进行一个流水灯式的一个跳变,大家可以看到这里面啊,进行流水灯式的一个跳变。 好,那这是我们第一个时间的现象啊,第一个时间线,那第二个时间线我们先左移后豫后右移啊,或者先右移后后走移,那其实都没关系,都是一样的啊,我们来看啊,这个怎么来做呢?其实前面的,首先最开始的话,前面的都是一样的,没有什么太大的区别,这里面我们是这里面都没什么区别, 这里都是这样的,你要先有一个值嘛,这些都是正常的,然后呢啊,到了后面呢就会有一定的一个区别,我们想是不是先,哎,你要先走完,走完这一段,然后再回来,对不对?那这段就要用到我们的两个 负循环啊,两个负循环,这一段代码呢,希望大家就是如果说你 c 元底子基础不是很好的同学一定要多看多敲多练啊。这个地方好,那首先呢,我们先啊,这里呢,由于啊跟前面一样的,就是我们这里是两边走,所以呢我们要干嘛呢?要在 它这里的时候设一个初始值啊?等于什么?零 x b 等于这个东西好,然后就开始负循环啊,负循环好,负循环呢?来我们想一下,负循环里面有三个参数,第一个参数设定初始值,对吧?第二个参数呢?我们的一个什么设定?我们的一个,呃,就是 比较啊。第三个呢就是我们的一个就是判断它的一个,呃,就是就是啊,迭代它的一个值的迭代。那我们这个怎么做呢?首先啊,先对第一个我们要做一个什么事情呢?哎,判断,判断是它啊,什么情况下 不需要那个了?大家思考一下是不是当它啊等于等于什么?零 x 哪个?大家想一下零 x f 的 时候,就是它从零 x f e 移动到零 x f, 我 们来看零 x f 是 一个什么样的现象啊?七 f, 哎,是不是嘛?来看一下, 到这边七 f 好, 到这边是一个什么?是不是最后一个灯点亮?那我们点到这个灯的时候,我们是不是就要开始干嘛往回点亮了吧,对不对?最开始是这样嘛? 啊?这个然后呢,现在是要等他干嘛?他点了这一个的时候啊?我们要往回,所以呢这里要考虑到这个点好,然后呢这里是叠带,那叠带其实其实是不就是我们刚刚这一段代码,对吧?就是这里其实就是我们叠带,我们需要他灯呢进行一个偏转好到这边来,这个 好,这里呢我们已经做好了,之后啊就可以干嘛呢?让我们的 p 一 啊, p 一 等于什么呢?好比特做一下,做一个这样的事情,好,然后呢让下面呢底内五百毫秒, ok, 这样是先往什么左移?这个是左移, 左移,好,这是第。呃,大家稍等一下,我看一下这个。是 啊,这里的话,啊,对,没错啊,先左移,好,没错,好,然后啊,然后我们应该是不是要反过来搞一次了,对吧?然后呢啊右移啊啊这里的话稍等,我想一下这点应该是我们的一个 啊没错没错,好,右移右移, ok, 我 们调动一下我们的一个右移,那然后在这边呢其实你也需要负一下初值啊。这个地方好负初值,那初值呢?这里呢是等于什么?那就是七 f 了,来思考一下是不是七 f 啊,对吧?七 f 啊,这里, 好,那我们啊已经调用到这一个之后呢就开始跑我们那个破循环啊破循环,那在这里面呢好,这个东西 那这里呢我们首先啊需要调用这个地方都啊都大差不差。这里是七 f, 那 上这边不就是他吗?一个一,一个最前一个最后吗?对不对?好,然后呢这里呢也是一样的,没什么本质上的一个很大的区别几乎是没有啊 很大的区别几乎是没有。然后这里呢需要改一下刚是 o l 嘛?对,我们先改成 o r, 好, 然后呢下面呢也没有什么太大区别啊,本子上面区别没有,那设定完之后呢?来啊,基本上就已经完工了。那现在呢我们把程序编一下来 ok, 那 我们现在呢来我看给他看一下这个效果啊。嗯,哎,等下这程序啊,不对啊,这个程序效果有点小问题,因为它是 demo 二啊,我给它改回来看看,刚刚是 demo 一 了,我们写的 demo 二来, 好,呃,看下下载成功没有,这边的话我们就已经下载成功了,让我们来看一下效果, 效果就是,哎,先看他啊,他会往一边走,然后呢?等走到镜头的时候再会,哎,是不会回来,对吧?这就是我们的一个效果。那这里呢,就是我关于我们流水灯的一个操作啊,希望大家在课后呢一定要啊去把这个做。