- 博客(32)
- 收藏
- 关注
原创 系统编程——进程的概念和基础
当我们双击一个桌面图标,或在命令行中输入一个指令,一个我们熟悉的应用便跃然屏上。无论是轻巧的文本编辑器,还是复杂的视频渲染软件,在我们看来,它们都是一个独立的、在计算机中“运行”的程序。然而,在看似平静的屏幕背后,现代操作系统正在上演着一场精彩绝伦的“多线程”交响乐。你的音乐播放器在播放歌曲,浏览器在下载文件,同时杀毒软件还在后台默默扫描——这些任务看似在同时进行,仿佛计算机拥有“分身术”。这背后的魔法,正是由**进程** 这一核心概念所驱动的。
2025-11-05 21:45:40
1014
原创 数据结构——Dijkstra算法
在探索图的世界时,我们常常面临一个经典问题:从一个起点出发,如何找到通往图中其他所有顶点的“最短”路径?无论是网络路由的数据转发,还是地图导航的路线规划,这个“单源最短路径”问题都是核心所在。在众多解决方案中,由荷兰计算机科学家Edsger W. Dijkstra提出的Dijkstra算法,无疑是其中最著名、最优雅的算法之一。它像一个有智慧的探索者,每一步都基于当前已知的“最优解”进行扩展,步步为营,最终绘制出一张完整的从起点到各处的最短路径地图。Dijkstra算法的魅力在于其清晰的贪心策略。
2025-09-30 12:16:48
1033
原创 数据结构——基本查找算法
在程序的世界里,数据的价值在于被使用,而使用的第一步往往是“查找”。一个查找算法的选择,直接决定了程序的响应速度与资源消耗,尤其是在大数据时代,其影响更是天差地别。从O(n)到O(log n)的效率跃迁,背后是算法设计智慧的体现。本文将聚焦于基本查找算法,深度剖析其内在原理与性能边界。顺序查找为何是通用性的代表,却又在效率上存在天花板。二分查找如何通过“半区排除”策略,实现对数级的惊人效率,以及它必须遵守的“有序性”前提。
2025-09-26 17:27:43
840
原创 数据结构——基本排序算法
在计算机科学的世界里,排序是一项无处不在、至关重要的基础操作。无论是数据库索引的快速查询,还是社交媒体的信息流展示,抑或是电商网站的商品列表,其背后都离不开高效排序算法的支撑。排序算法的优劣,直接决定了程序的响应速度和资源消耗,是衡量程序员内功深浅的重要标尺。本篇文章将带领大家踏入排序算法的殿堂,聚焦于那些最经典、最常用的基本排序算法。我们从最直观的“冒泡排序”和“选择排序”入手,理解算法是如何一步步通过比较和交换来让数据变得有序;然后探讨“插入排序”,体会它在处理“近乎有序”数据时的惊人效率。
2025-09-26 16:40:13
899
原创 Linux文件IO——标准IO
在Linux系统编程的体系架构中,文件I/O始终处于核心地位。当开发者从原始的系统调用(open、read、write等)转向更高级的标准I/O库时,他们选择的不仅是一组更方便的API,而是一个经过数十年验证的高性能I/O处理范式。标准I/O库的诞生源于对系统调用本质缺陷的深刻认知:每次read/write操作都涉及用户态与内核态的上下文切换,这种切换在现代处理器架构中的开销令人难以忽视。更关键的是,无缓冲的小规模I/O操作无法有效利用现代存储设备的块传输特性,导致物理I/O效率低下。首先,智能缓冲系统。
2025-09-20 06:00:00
1348
原创 数据结构——二叉树和BST(2)
在计算机科学中,二叉树(Binary Tree)是一种非常重要且基础的数据结构,它为解决层次性、关联性数据问题提供了强大的模型。而二叉搜索树(Binary Search Tree, BST),作为二叉树的一种特例,因其卓越的查找、插入和删除性能,在理论和实践中都占据了核心地位。本文将深入浅出地解析二叉树和二叉搜索树的核心概念、工作原理及常见操作。无论您是正在学习数据结构的新手,还是希望巩固基础知识的开发者,相信都能从中获益。我们将从最简单的二叉树遍历开始,逐步深入到BST的高效操作,并探讨其性能表现。
2025-09-19 19:16:09
928
原创 数据结构——二叉树和BST(1)
在计算机科学中,二叉树(Binary Tree)是一种非常重要且基础的数据结构,它为解决层次性、关联性数据问题提供了强大的模型。而二叉搜索树(Binary Search Tree, BST),作为二叉树的一种特例,因其卓越的查找、插入和删除性能,在理论和实践中都占据了核心地位。本文将深入浅出地解析二叉树和二叉搜索树的核心概念、工作原理及常见操作。无论您是正在学习数据结构的新手,还是希望巩固基础知识的开发者,相信都能从中获益。我们将从最简单的二叉树遍历开始,逐步深入到BST的高效操作,并探讨其性能表现。
2025-09-19 11:32:52
1253
原创 数据结构——队列
在纷繁复杂的数据结构世界里,有一种结构以其极致的简洁和强大的秩序性脱颖而出,它就是——队列(Queue)。说栈(Stack)体现了“后来居上”的哲学,那么队列则完美诠释了“先来后到”的公平规则。这种“先进先出的线性表,就像我们日常生活中任何一场井然有序的排队:第一个排队的人,必将第一个享受到服务。这种看似简单的规则,却是构建庞大而稳定系统的基石。从操作系统管理进程调度,到网络通信处理海量数据包;从用户点击鼠标触发的事件管理,到多线程编程中的任务协调——队列的身影无处不在。
2025-09-19 10:35:27
860
原创 数据结构——栈
在软件的世界里,数据并非总是杂乱无章地堆放。很多时候,我们需要一种井井有条的结构来管理数据,确保它们能以某种特定的、可预测的顺序被添加或移除。栈(Stack)正是这种最简单又最重要的数据结构之一。它就像是我们在生活中熟悉的弹匣、一摞书或者一叠盘子,遵循着“后进先出”(LIFO)的原则。这种看似简单的规则,却在计算机科学的各个角落发挥着巨大的作用,从程序运行的底层机制到我们日常使用的软件功能,无处不在。
2025-09-18 20:30:03
975
原创 Linux文件IO——系统IO
在 Linux 的世界里,一切皆文件。无论是普通的文本文件、目录,还是硬件设备、网络套接字,都可以通过一套统一而强大的接口进行访问和操作。这套接口的核心,便是我们常说的“文件 I/O”。文件 I/O 主要分为两大阵营:一是由标准 C 库提供的标准 I/Ostdio),它提供了带缓冲的、更便于使用的流式操作;二是直接由 Linux 内核提供的系统 I/Osyscall),它更底层、更直接,是理解 Linux 系统运作原理的基石。本系列文章将聚焦于后者——系统 I/O。我们将深入探讨openread。
2025-09-12 23:36:28
1052
原创 数据结构——单向循环链表代码(补充)
在此前的文章中(链接如下),只有单向链表的代码,接下来我们来写单向循环链表,并用其实现一个简单的学生信息链表。
2025-09-08 22:03:13
382
原创 数据结构——双向链表
在计算机科学的广阔领域中,数据结构是构建高效、可靠软件的核心基石。当我们谈论线性数据结构时,链表凭借其动态内存管理的天然优势,成为了不可或缺的一环。而在链表的家族中,双向链表(Doubly Linked List)无疑是一位兼具灵活性与实用性的重要成员。与单向链表不同,双向链表的每个节点都包含了两个指针:一个指向它的后继节点(next),另一个指向它的前驱节点(prev这一看似微小的结构改变,带来了质的飞跃。它使得链表不仅可以单向顺序访问,还能支持反向遍历,这为许多操作带来了极大的便利。
2025-09-08 21:38:05
1055
原创 数据结构——顺序表和单向链表(2)
在软件的世界里,程序 = 数据结构 + 算法。这句广为流传的名言,深刻地揭示了数据结构的核心地位。它是我们组织、存储和管理数据的艺术,是构建高效、稳定应用程序的基石。而在众多数据结构中,线性表作为最基础、最常用的一种,其重要性不言而喻。顺序表和单向链表,正是线性表两种最经典的实现方式。连续的空间与离散的空间。顺序表凭借其底层连续的物理结构,带来了无与伦比的随机访问性能,仿佛一本页码清晰的书籍,我们可以根据目录瞬间翻到任何一页。
2025-09-03 21:50:18
821
原创 数据结构——顺序表和单向链表(1)
在软件的世界里,程序 = 数据结构 + 算法。这句广为流传的名言,深刻地揭示了数据结构的核心地位。它是我们组织、存储和管理数据的艺术,是构建高效、稳定应用程序的基石。而在众多数据结构中,线性表作为最基础、最常用的一种,其重要性不言而喻。顺序表和单向链表,正是线性表两种最经典的实现方式。连续的空间与离散的空间。顺序表凭借其底层连续的物理结构,带来了无与伦比的随机访问性能,仿佛一本页码清晰的书籍,我们可以根据目录瞬间翻到任何一页。
2025-09-02 22:05:02
830
原创 Ubuntu22.04网络图标消失问题
当下一次启动时,NetworkManager 读取到这个损坏或错误的状态,可能会认为自己处于一个异常状态,从而无法正常启动或初始化,导致其图形化前端(nm-applet)也无法启动,图标自然就消失了。如果系统意外断电、强制重启或 NetworkManager 进程被异常杀死,这个状态文件可能会损坏或包含不一致的信息(例如,错误地记录自己已经。NetworkManager 将其当前状态(例如:是否已启用、上次的联网状态等)记录在一个文件里,这个文件通常就是。,但实际上并未完全启动)。
2025-09-01 20:55:14
702
原创 预处理——嵌入式学习笔记
我们编写的C语言源程序(.c文件)或C++源程序(.cpp文件)无法直接在Ubuntu系统或开发板系统中运行。机器无法理解高级语言:计算机硬件只能识别和执行二进制机器指令(0和1)代码需要转换:高级语言编写的代码必须经过一系列处理步骤,转换为机器可执行的格式系统差异:不同的硬件架构和操作系统需要不同的可执行文件格式概念:在某些情况下,宏参数中的符号并非用来传递参数值,而是用来形成多种不同的字串。这种技术常用于系统函数和框架设计中,用于规范化函数命名和结构。// 普通函数(4个规范的函数)
2025-09-01 20:40:38
892
原创 联合体和枚举——嵌入式学习笔记
在C语言的编程世界中,我们早已熟悉了结构体struct这种能将不同数据类型捆绑在一起的“打包”神器。但你是否想过,如果有一块内存,可以灵活地存放不同类型的数据,但在同一时刻只使用其中一种,该如何实现?又是否曾为那些 magic number(魔法数字)和意义不明的整数常量而头疼?这就是联合体(union)和枚举(enum)大显身手的地方。它们一个是高效利用内存的“变体”专家,一个是提升代码可读性与安全性的“语义化”大师。本篇博客将带你深入浅出,探索这两个强大工具的奥秘,让你的C代码更加专业、优雅和高效。
2025-08-30 23:33:46
365
原创 结构体尺寸——嵌入式学习笔记
在C语言中,结构体(struct)是一种强大的数据封装工具,它将多个可能不同类型的成员组合成一个整体。然而,结构体类型变量所占用的内存空间大小(由sizeof运算符返回)并非其各成员变量大小之和。这一现象源于现代计算机系统为提升内存访问效率而普遍采用的内存对齐(Memory Alignment)原则。内存对齐并非C语言标准所强制规定,而是编译器根据目标硬件平台的特性所遵循的一种优化策略。它要求每个成员的地址必须满足其自身对齐要求的整数倍,这不可避免地会在成员之间或结构体末尾插入未使用的。
2025-08-29 23:17:57
531
原创 内存管理——嵌入式学习笔记
在C语言的编程世界中,内存管理始终是一个核心且无法回避的话题。不同于许多现代高级语言的自动内存管理机制,C语言将内存控制的权力完全交给了程序员——这份权力带来了无与伦比的灵活性和性能优势,同时也伴随着巨大的责任和挑战。内存错误堪称C程序中最隐蔽、最难调试的bug类型之一:内存泄漏会逐渐吞噬系统资源,野指针可能导致程序崩溃,缓冲区溢出更是严重的安全漏洞源头。正是这些特性,使得C语言内存管理成为区分新手与资深程序员的重要标志。本文章将带您深入C语言内存管理的核心领域。
2025-08-28 21:55:39
1389
原创 函数的引用——嵌入式学习笔记
想象一下,你有一个工具箱(你的代码),里面装满了各种工具(函数)。通常,你都是直接拿起锤子(调用函数)来敲钉子。但有没有一种方法,你可以把“使用锤子”这个动作本身,写在一张指令卡上,然后交给别人(另一个函数)去执行?甚至可以根据情况,随时把指令卡上的内容换成“使用螺丝刀”?在C语言中,函数引用(通常通过函数指针实现)就是这张神奇的“指令卡”。它允许你将函数作为参数传递、存入数组、或者根据运行时情况动态选择要执行的操作。这种灵活性为程序设计打开了新世界的大门。
2025-08-27 21:52:22
1078
原创 指针进阶——嵌入式学习笔记
在初阶指针的世界里,我们学会了如何使用和操作符与变量地址进行最基本的对话。那是一个美好的起点,让我们窥见了C语言不同于其他高级语言的底层魅力。然而,这仅仅是故事的开始。真正的力量,隐藏在指针更复杂、更精妙的运用之中。如果说初阶指针是给了我们一把钥匙,那么进阶指针则是为我们展开了一张通往整个内存宇宙的地图。本期博客,我们将携手进行一场深度的探索,系统性地剖析指针的核心机制与高级应用。本源追溯:指针语法深度剖析我们将抛开表象,深入[]()等操作符在编译器眼中的结合律与优先级,理解复杂指针声明的。
2025-08-26 21:59:16
1030
原创 数组进阶——嵌入式学习笔记
在初阶篇中,我们搭建了关于数组的坚实基础:它如何通过索引实现O(1)的高效随机访问、其长度不可变的特性以及在内存中的连续存储方式。这些特性使得数组成为处理批量数据的绝佳起点。然而,真正的挑战和魅力始于初阶之后。当我们试图解决更复杂的现实世界问题时,简单的静态数组往往力不从心。如何高效地插入或删除元素?如何应对动态变化的数据集?如何用数组表示棋盘、地图等逻辑上的二维甚至三维结构?这正是数组进阶篇所要探讨的核心。在本篇中,我们将拨开云雾,深入数组的更高级应用,理解数组的进阶知识,为后续学习更复杂的字符串。
2025-08-25 21:42:40
389
原创 指针初阶——嵌入式学习笔记
在C语言的世界里,有一座令无数初学者望而生畏却又心向往之的“珠穆朗玛峰”,它的名字叫指针。它被誉为C语言的灵魂与精华,是理解内存管理、实现高效编程的终极钥匙。但同时,它也是“段错误”(Segmentation Fault)和内存泄漏的万恶之源。你是否曾对和的用法感到困惑?是否曾面对多级指针头晕目眩?是否曾疑惑为何函数无法修改实参?这一切问题的答案,都藏在指针的背后。本篇博客将作为你的指针“破壁指南”。我们将剥开指针神秘的外壳,从内存地址。
2025-08-24 22:56:02
1068
原创 数组初阶——嵌入式笔记
在计算机科学浩瀚的知识体系中,数据结构是构建高效程序的骨架。而数组,作为最基本、最常用的线性表数据结构,其重要性怎么强调都不为过。它不仅是许多编程语言内置的核心数据类型,更是理解内存管理、算法效率(时间复杂度/空间复杂度)的绝佳起点。本博客旨在为你提供一份关于数组的系统性初阶指南。内核揭秘:深入探讨数组在内存中的存储原理与特性。操作全解:详细分析增、删、改、查等基本操作的实现与性能。思维跃迁:介绍面对数组问题时的核心思想,如双指针、滑动窗口、二分查找等。实战应用。
2025-08-24 22:27:10
395
原创 运算符——嵌入式学习笔记
在C语言的世界里,数据是砖瓦,而运算符则是我们砌墙盖楼的工具。无论是进行简单的加减乘除,还是完成复杂的位操作与逻辑判断,运算符都无处不在,它是构成所有表达式和程序逻辑的基石。理解运算符,不仅仅是记住它们的符号和优先级,更是理解计算机如何“思考”和处理数据的过程。本系列将带你系统性地探索C语言的运算符家族,从最基础的算术运算到精巧的位运算,帮助你彻底掌握这门“工具”的使用方法,从而编写出更高效、更精炼的代码。让我们开始这段旅程,一起解锁C语言的核心表达能力吧!
2025-08-23 23:44:28
1305
原创 数据类型(3)——嵌入式学习笔记
无法匹配scanf()指定格式的数据,将被遗留在输入缓冲区中,不会消失,需要使用while(getchar()!变量的类型:int型、浮点型、char型、字符串型、布尔型(还有它们的 无符号、短、长拓展型等)scanf()与printf()不同,scanf()的格式控制字符串不可乱写,尤其是结尾处的\n。为所有的系统提供一组固定的、能反应数据尺寸的、统一的可移植性整型名称。可以对任意的数据做任意的类型的转换,但转换之后的数据解释不一定有意义。因此,系统标准整型数据类型,是不可移植的,这个问题在。
2025-08-23 22:57:30
596
原创 数据类型(2)——嵌入式学习笔记
在C语言的广阔天地中,数据类型是一切运算和逻辑的基石。它定义了变量所占内存的大小、所能存储的数值范围以及可以执行的操作。深入理解数据类型,不仅是避免溢出、精度丢失等常见错误的关键,更是编写高效、稳定且节省资源程序的先决条件。本篇将系统性地剖析C语言中的各类数据类型,助您打下坚实牢固的语言基础。
2025-08-22 21:50:08
967
原创 数据类型(1)——嵌入式学习笔记
在C语言的广阔天地中,数据类型是一切运算和逻辑的基石。它定义了变量所占内存的大小、所能存储的数值范围以及可以执行的操作。深入理解数据类型,不仅是避免溢出、精度丢失等常见错误的关键,更是编写高效、稳定且节省资源程序的先决条件。本篇将系统性地剖析C语言中的各类数据类型,助您打下坚实牢固的语言基础。一、整型(int: integer)概念:表达整型类型的数据(正整数,0,负整数)( 全称:integer)// 定义了一个专门存放整形数据的变量(variable)
2025-08-21 21:59:30
1319
原创 C语言入门——嵌入式学习笔记
在学习嵌入式系统时,C语言的重要性不可忽视。作为嵌入式开发的主流语言,C语言以其高效的执行速度、直接访问硬件的能力以及良好的可移植性,成为处理资源受限的嵌入式设备(如微控制器和传感器)的理想选择。许多实时操作系统(RTOS)和底层驱动都基于C语言构建,掌握C语言能帮助学习者深入理解内存管理、指针操作和硬件交互等核心概念,从而为实际嵌入式项目(如物联网设备或工业控制系统)打下坚实基础。
2025-08-20 23:12:26
616
原创 分支与循环(2)——循环结构
表达式1(初始化表达式)省略时,相当于省去了循环变量的初始值,此时需要在for语句之前赋值变量的初始值;表达式2(循环条件)省略时,表示不判断循环条件,始终认为循环条件为真,此时循环会一直执行下去,形成死循环;表达式3(操作表达式)省略时,没有操作表达式,如果循环条件为真,则循环无法结束。
2024-01-29 14:21:51
992
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅