- 博客(44)
- 收藏
- 关注
原创 GPIO简介(GPIO输出)
比如I^2C通信的情况下,这个模式可以避免各个设备的相互干扰,另外开漏模式还可以用于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS。引脚的控制权转移到了片上外设,由片上外设来控制,在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接受一下电平信号。其中在GPIO的这8种模式中,除了模拟输入这个模式会关闭数字的输入功能,在其他的7个模式下中,所有的输入都是有效的。这里输出是断开的,输入的施密特触发器是关闭的无效的状态。
2025-06-12 15:00:00
636
原创 C++——stack和queue
结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如。虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为。进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。
2025-06-12 07:00:00
701
原创 STM32单片机简介
在使用外部晶振时,需要在晶振两端连接两个起振电容,电容值一般在 10pF-40pF 之间,还可在晶振输入输出引脚之间加一个 1M 的电阻,产生负反馈,保证放大器工作在高增益的线性区,同时起到限流作用。不给时钟的情况下,操作外设是无效的,外设也不会工作,这样的目的是降低功耗。STLINK用的是SWD的方式,所以只需要占用PAB和PA14这两个IO口,在使用SWD的调试方式时,剩下的PA15、PB3、PB4可以切换为普通的IO口来使用,但要在程序中进行配置,不配置的华默认是不会用做IO口的。
2025-05-30 15:00:00
1023
原创 C++——list
要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过上面的学习,这些内容已基本。通过前面例子知道,反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,//1、封装,通用的相似的遍历容器的方式,并且封装屏蔽了容器结构的差异和底层实现的细节。list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已。因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对。前面说过,此处大家可将迭代器暂时理解成类似于指针,
2025-05-30 07:00:00
936
原创 Linux——网络基础概念
4.不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).7.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理.IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,1.0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的。
2025-05-23 17:00:00
503
原创 C++——vector
动态扩容机制:当元素数量超过容量时,vector会重新分配更大的内存空间(通常是原容量的 2 倍),并将原有元素复制到新空间,这可能导致性能开销。学习STL的三个阶段:能用,明理,能扩展(总概括),我们学习vector也按照这个方法来学习。erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理。的位置,而end位置是没有元素的,那么pos就失效了。2. 如果拷贝的是自定义类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型。
2025-05-23 08:00:00
1063
原创 C/C++——动态爱心
这个函数主要用于初始化图形绘制相关的环境,首先创建一个指定大小(xScreen 和 yScreen)的图形窗口,然后通过设置窗口的样式去掉标题栏,调整窗口的位置和显示状态,接着开启批量绘制模式(BeginBatchDraw),这样可以提高图形绘制的效率,同时设置好坐标原点和纵横比,让绘制的图形在窗口中的布局更加合理,最后利用srand结合当前时间初始化随机数生成器,保证每次运行程序的随机效果不同。运用语言:C/C++。:定义了圆周率的值,在涉及到三角函数等数学计算(比如计算爱心轮廓的坐标等)时会频繁用到。
2025-05-16 17:30:00
579
原创 C——彩色玫瑰花
我们的目标是在控制台窗口中绘制一朵旋转的玫瑰花,花瓣会随着时间变化呈现出不同的颜色。通过数学公式,我们可以精确地计算出花瓣的形状和位置,再结合颜色变换和旋转效果,创造出一个视觉上引人入胜的动画。其中,r 是点到原点的距离,θ 是角度,k 是一个决定花瓣数量和形状的参数。下面就来讲讲本人今日完成的一朵动态的玫瑰花,可能不太好看,请体谅。以上便是这朵玫瑰花的代码相关解析了,希望对大家有所帮助,如果代码有错误,希望大家体谅并指出。编译器:VS2022。尝试不同的数学曲线,如心形线、螺旋线等,创造更多有趣的图形。
2025-05-16 08:00:00
450
原创 C——推箱子小游戏
推箱子是一款经典的益智游戏,玩家需要在一个迷宫般的地图中,将箱子推到指定的目标位置。在本篇博客中,我们将用C语言实现推箱子游戏,玩家可以通过键盘指令来控制角色移动,并把箱子推到目标位置。:通过读取键盘输入来控制玩家的移动方向,例如: w 表示向上移动, s 表示向下移动, a 表示向左移动, d 表示向右移动。5.游戏胜利判断:isGameWon函数通过遍历地图检查是否全部箱子已到达目标点,如果全部已到达返回1,表示游戏胜利,反之返回0。- '#' :墙壁,玩家和箱子都不能通过。
2025-05-15 14:30:00
593
原创 C——贪吃蛇(Windows系统)
,然后绘制上下边界,接着遍历整个游戏界面区域,根据坐标判断是绘制食物、蛇身还是空白区域,最后再绘制下边界,这样一个简单的游戏界面就呈现出来啦。我们把这个游戏大致分为几个模块来思考,分别是游戏元素的结构体定义、游戏的初始化、界面绘制、用户输入处理以及蛇的移动逻辑等部分,这样后续写代码的时候条理就会更加清晰啦。这里先初始化蛇和食物,然后进入一个无限循环,在每次循环中依次绘制界面、处理用户输入、移动蛇,并且通过Sleep函数稍微停顿一下,让游戏的节奏更合适,便于玩家操作哦。语言:这里运用C语言。
2025-05-15 08:30:00
681
原创 C——俄罗斯方块
俄罗斯方块的规则很简单,游戏区域通常是一个类似矩形的空间(比如常见的 20 行 10 列的布局),各种形状的方块会从游戏区域的上方依次落下。玩家需要通过操作让这些方块左右移动、旋转,使其尽可能紧密地填满一行或者多行,当一行被方块填满时,这一行就会消除,同时玩家会获得相应的分数,游戏就这样持续进行下去,直到方块堆积到顶,游戏结束啦。旋转函数的实现会稍微复杂一些,要先计算出旋转后的方块坐标,再判断是否能旋转(也就是检测碰撞情况),如果可以,就更新方块的旋转状态和坐标位置哦。第2种基本方块:有2种形态。
2025-05-14 16:00:00
1049
原创 C——2048小游戏
游戏开始时,在一个4*4的方格棋盘内会有2或4的数字方块产生,玩家移动方向键(上下左右)来操控方块移动,移动时是整体向一个方向移动,使两个相同的数字相撞在一起合成相加之后的数字,每一次移动相撞后,会有新的方块产生,当方块占满整个棋盘,并且无论向哪个方向移动都无法继续让数字方块合成,即游戏结束。两块带数字的方格合并后的数字为合并的得分,一次上下左右移动后游戏面板上所有合并的得分总和为一次移动的得分,多次移动的得分进行累加作为当前总得分。移动检测:记录移动前后的棋盘状态,判断是否发生有效移动。
2025-05-14 09:00:00
464
原创 C——五子棋小游戏
特殊情况特殊判胜负。游戏目标是在一个棋盘上,通过在横、竖、斜线上依次放置棋子,使自己的五个棋子连成一线,即横线、竖线或斜线,且无被对手堵住的空位,从而获胜。四四禁手:黑方一子落下同时形成两个或两个以上的 “活四”(“活四” 指已有四枚同色连续棋子且两端有空点可延伸,下子必成五子连珠的棋形),此点为四四禁手,黑方下在此处算违规,白方获胜。双方交替将自己颜色的棋子(黑方执黑子,白方执白子)放置在棋盘的空交叉点上,每次只能落一子,且落子位置必须是没有棋子的空交叉点,不可以在已有棋子占据的点或者棋盘范围之外落子。
2025-05-12 21:56:20
1735
原创 C++——string类
1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差。G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个。的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户。不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可。资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,
2025-05-12 11:05:33
1909
原创 C——猜数字游戏
然后根据我们的选择,选择进入游戏,就需要产生一个随机数,意不要把产生随机数的环节加入到while循环里面,不然每次猜都会生成一个随机数那那估计永远都猜不到,因为rand函数的种子是以time函数的返回值为参数的,时间戳在随时变化,那么如果放到循环里面每次判断一轮产生的rand的返回值都不一样随机数也就在变化,除非你运气好的爆炸,能够一次就猜中;如果再深⼊了解⼀下,我们就不难发现,其实 rand 函数⽣成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法⽣成的随机数。
2025-05-11 20:59:18
924
2
原创 STL简介
例如,排序只需一行 std::sort(v.begin(), v.end())。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读。复用性:提供了通用的数据结构(如 vector、map)和算法(如 sort、find),避免重复造轮子。高效算法:STL 的算法经过高度优化,如 sort 基于快速排序和插入排序的混合实现,性能接近理论最优。内存管理:容器(如 vector)自动管理内存,避免手动分配 / 释放内存的风险(如内存泄漏)。
2025-05-11 09:58:53
822
原创 C——数组和函数实践:扫雷
玩家在展示的雷区中选择扫雷的位置,而对扫雷的判断只需要核对另一个雷区的相应位置上是否有雷。若玩家点击的方格里没有埋雷,方格处就会显示它周围一圈方格(去心的3x3九宫格)的雷的数量,而当周围一圈方格里都没有埋雷,系统就会对更大的无雷范围进行清扫;首先,我们需要创建一个test函数来实现游戏刚开始的进程,并在游戏开始的时候,打印一个游戏菜单,以便玩家操作。我们分别创建两个相同大小的9x9的二维数组当作雷区,并规定:在二维数组中字符“ * ”代表待排区域,字符“ 0 ”代表非雷,字符“ 1 ”代表雷。
2025-05-09 23:06:48
683
原创 C++——内存管理+模板
原因:我们在堆上动态申请的空间是连续的,而由系统直接分配的栈中的空间是分布式的,不是连续的。new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申。4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需。3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,
2025-05-09 12:26:04
715
原创 C——操作符详解
16进制的数字每⼀位是0~9, a~f 的,0~9, a~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。在日常中,我们都会听到二进制,八进制,十进制,十六进制这样的话语。
2025-05-08 21:56:13
1056
原创 C——VS的调试技巧
它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的,以便⽤⼾很好地使⽤。编译错误,随着语⾔的熟练掌握,会越来越少,也容易解决。在函数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。1. 栈区内存的使⽤习惯是从⾼地址向低地址使⽤的,所以变量i的地址是较⼤的。在VS上切换到X64,这个使⽤的顺序就是相反的,在Release版本的程序中,这个使⽤的顺序也是相反的。试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码,重新测试。
2025-05-08 15:29:30
818
原创 C——函数递归
函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。递归:递归代码在处理具有递归结构的问题(如树的遍历、分治算法等)时,代码可能更简洁,更符合人们对问题的分解式思考方式,但对于初学者或者复杂逻辑,理解起来可能有一定难度。在C语⾔中每⼀次函数调⽤,都需要为本次函数调⽤在内存的栈区,申请⼀块内存空间来保存函数调⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。
2025-05-07 20:30:29
1059
原创 C——函数
代码2中,我们从输出结果来看,i的值有累加的效果,其实 test函数中的i创建好后,出函数的时候是不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static。我们在调试的时候可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不⼀样的,所以我们可以理解为形参是实参的⼀份临时拷贝。但是全局变量被 static。
2025-05-06 20:55:48
983
原创 C——数组
从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。所以我们得出结论:数组在内存中是连续存放的。素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的⼤⼩和数组的元素类型。上面的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元。
2025-05-06 15:43:18
607
原创 数据结构——算法复杂度
空间复杂度也是⼀个数学表达式,是对⼀个算法在运⾏过程中因为算法的需要额外临时开辟的空间。总之,要依据具体的应用场景、资源条件以及对时间和空间的侧重要求等来综合考虑,选择最优的算法或者对现有算法进行合理的优化,以达到最佳的性能表现。因此衡量⼀个算法的好。定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。⼤O的渐进表⽰法在实际中⼀般情况关注的是算法的上界,也就是最坏运⾏情况。
2025-05-05 21:06:14
1749
原创 C++——类和对象(三)
代码可读性:虽然匿名对象能让代码简洁,但如果过度使用,尤其是在复杂逻辑中频繁出现匿名对象,可能会导致代码可读性变差,后续维护人员难以理解代码意图,所以要根据实际情况合理使用。移动语义:C++11 引入了移动语义,它可以进一步减少对象拷贝的开销。内存管理:内部类对象的生命周期可能和外部类对象相关联,尤其是成员内部类,在创建和销毁时要考虑到对外部类对象引用的影响,避免出现内存泄漏等问题。友元关系不具有传递性:如果类 A 是类 B 的友元,类 B 是类 C 的友元,并不意味着类 A 是类 C 的友元。
2025-05-04 09:10:04
776
原创 C——文件操作
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
2025-05-01 09:00:00
607
原创 C——编译和链接
将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字⾯量、特殊字符等)。编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。注:在Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o。处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
2025-04-30 16:30:00
510
原创 C——指针(五)
回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。sizeof 计算变量所占内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数。稳定性:qsort函数使用的快速排序算法是不稳定的,即相等元素的相对顺序可能会改变。
2025-04-30 09:30:00
275
原创 C——指针(四)
解释:p先和*结合,说明p是⼀个指针变量,然后指针指向的是⼀个⼤⼩为10个整型的数组。数组是⼀个存放相同类型数据的存储空间,那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组.确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过。那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?存放的是整形变量的地址,能够指向整形数据的指针。
2025-04-29 16:30:00
690
原创 C——指针(三)
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址。2)&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)。我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地址。上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。
2025-04-29 10:30:00
376
原创 C——指针(二)
如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址会报错.const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。⼀般来讲const修饰指针变量,可以放在*的左边,也可以放在*的右边,意义是不⼀样的。
2025-04-28 21:54:26
791
原创 C——指针(一)
就像现实生活中的地址能帮助我们找到具体的房屋一样,指针所存储的内存地址能让我们定位到内存中的某个特定位置,从而访问或修改该位置上的数据。在上⾯的代码中,将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址,这样的设计可以。类型的指针不能直接进⾏指针的+-整数和解引⽤的运算。
2025-04-28 10:21:07
686
原创 C++——类和对象(二)续
像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器⾃动⽣成的赋值运算符重载完成的值拷⻉/浅拷⻉不符合我们的需求,所以需要我们⾃⼰实现深拷⻉(对指向的资源也进⾏拷⻉)。除⾮⼀些很特殊的场景,⽐如我们不想让别⼈取到当前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。3. 没有显式实现时,编译器会⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认拷⻉构造函数类似,对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的赋值重载函数。
2025-04-27 14:29:53
898
原创 C——数据在内存中的存储
但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;⽐如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为:0 01111110 00000000000000000000000。
2025-04-26 16:40:52
608
原创 C——字符函数和字符串函数
strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串。strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷贝的内容并且。strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标。如果源字符串的⻓度⼩于num,则拷贝完源字符串之后,在⽬标的后边追加0,直到num个。
2025-04-26 14:30:16
455
原创 C——结构体
在编程的世界里,结构体(Struct)是一种非常实用的数据类型,它允许我们将不同类型的数据组合在一起,形成一个新的、更复杂的数据结构。下图是⽹络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要⼏个bit位就能描述,这⾥使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
2025-04-25 14:34:20
868
原创 C++——类和对象(二)
要注意很多同学会认为默认构造函数是编译器默认⽣成那个叫默认构造,实际上⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调⽤的构造就叫默认构造。7) 我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要⽤初始化列表才能解决。6)还需要注意的是我们显⽰写析构函数,对于⾃定义类型成员也会调⽤他的析构,也就是说⾃定义类型成员⽆论什么情况都会⾃动调⽤析构函数。
2025-04-25 11:53:25
502
原创 数据结构——顺序表和链表
链表中每个结点都是独⽴申请的(即需要插⼊数据时才去申请⼀块结点的空间),我们需要通过指针变量来保存下⼀个结点位置才能从当前结点找到下⼀个结点。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续。顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。
2025-04-24 11:04:11
260
原创 数据结构——二叉树
通常的⽅法 是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩 ⼦所在的链结点的存储地址。树结构相对线性表就⽐较复杂了,要存储表⽰起来就⽐较⿇烦了,既然保存值域,也要保存结点和结 点之间的关系,实际中树有很多种表⽰⽅式如:双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。⼀个⼆叉树,如果每⼀个层的结点数都达到最⼤值,则这个⼆叉树就是满⼆叉树。要注意的是满⼆叉树是⼀种特殊的完全⼆叉树。⽗结点/双亲结点:若⼀个结点含有⼦结点,则这个结点称为其⼦结点的⽗结点;
2025-04-22 15:24:07
516
原创 数据结构——七大排序
相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,⽽在排序后的序列中,r[i]仍在r[j]之。希尔排序法⼜称缩⼩增量法。的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的。所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的。交换排序的特点是:将键值较⼤的记录向序列的尾部移动,键值较⼩的记录向序列的前部移动。
2025-04-22 14:44:03
763
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人