- 博客(48)
- 收藏
- 关注
原创 TCP与UDP核心解析
TCP与UDP的本质区别在于可靠性与传输效率的取舍:TCP通过连接建立、确认机制等保证可靠传输,但开销较大;UDP无连接、不可靠,但速度快延迟低。典型应用场景上,TCP适用于网页浏览、文件传输等对准确性要求高的场景,UDP则更适合直播、游戏等实时性需求。面试应答应抓住"连接性、可靠性、效率、场景"四个核心点,避免常见误区如"UDP一定丢包"或"TCP比UDP好"。
2026-04-13 19:41:30
487
原创 C++ 智能指针
摘要:C++智能指针是解决原生指针内存管理痛点的关键工具。文章分析了手动管理内存的三大问题:内存泄漏、重复释放和野指针,并介绍了三种智能指针:unique_ptr(独占所有权,性能最优)、shared_ptr(共享所有权,引用计数)和weak_ptr(解决循环引用)。重点讲解了RAII机制原理,对比了各类智能指针特性,提供了实战避坑技巧,推荐优先使用make_unique/make_shared。掌握智能指针能显著提升代码安全性和可维护性,是C++开发者必备的核心技能。
2026-04-13 19:00:27
559
原创 C++ STL中vector与list的核心区别
本文深入对比了C++ STL中vector和list的核心差异。vector基于动态数组实现,支持高效随机访问(O(1))和缓存优化,但中间插入/删除需移动元素(O(n))且可能引发迭代器失效;list采用双向链表结构,任意位置插入/删除高效(O(1))且迭代器稳定,但不支持随机访问且内存开销大。实际开发中应根据场景选择:高频随机访问/尾部操作选vector,频繁中间修改/稳定迭代器需求选list。理解二者底层差异可避免性能陷阱,如误用list进行随机访问或忽视vector扩容开销。
2026-04-11 22:21:16
464
原创 彻底搞懂 C++ vector 的 push_back 与 emplace_back
C++中push_back与emplace_back的深度解析 核心区别: push_back:先构造对象再拷贝/移动到容器("先造后搬") emplace_back:直接在容器内构造对象("就地构造") 性能对比: 对于自定义类,emplace_back避免了临时对象的构造和拷贝,性能更优 内置简单类型两者性能差异不大 使用建议: 优先使用emplace_back处理临时对象 配合reserve避免扩容开销 嵌套容器场景emplace_back优势更明显 注意事项:
2026-04-11 19:10:57
408
原创 Qt实战:从零搭建五子棋项目(附完整思路+核心代码)
本文介绍了使用Qt开发五子棋游戏的完整过程,从项目搭建到功能实现。项目采用模块化设计,分为界面、逻辑和工具三个核心模块,实现了15×15标准棋盘、双人对战、人机对战、胜负判定等基本功能。文章详细讲解了图形绘制、信号槽机制、坐标转换等关键技术点,并提供了完整的核心代码。通过该项目,开发者可以掌握Qt的图形界面开发、游戏逻辑设计等实用技能。文章还给出了功能优化建议和常见问题排查方法,适合Qt初学者作为实战练手项目。
2026-04-10 13:05:07
418
原创 C++ vector:从本质到实战,新手也能轻松上手
本文深入剖析C++ STL中的vector容器,揭示其作为"封装后的动态数组"的本质特性。从底层结构看,vector通过三个指针(start/finish/end_of_storage)管理连续内存空间,实现动态扩容机制(通常1.5-2倍增长)。文章重点分析vector的核心特性:值语义(存储副本而非引用)和自动内存管理(无需手动new/delete),并给出实用技巧:提前reserve避免扩容、优先使用emplace_back提升效率。同时指出常见陷阱:下标越界、迭代器失效、中间插入效
2026-04-10 12:46:36
325
原创 Qt 桌面计算器项目
摘要:本项目基于Qt5框架开发了一款功能完善的桌面计算器应用,采用C++语言和QtWidgets模块实现。计算器支持基础四则运算、括号优先级计算、数字输入、清零和退格等核心功能,并通过QScriptEngine实现表达式解析。项目重点实现了信号与槽机制、UI布局优化和样式美化,解决了包括中文乱码、模块依赖等开发过程中的典型问题。该应用不仅展示了Qt开发的基本流程,也为后续扩展科学计算等功能奠定了基础,是学习Qt界面开发的经典入门案例。
2026-04-08 14:42:20
889
原创 深入解析管道:最基础的进程间通信(IPC)实现
摘要:管道是进程间通信(IPC)最基本的方式,分为无名管道(PIPE)和有名管道(FIFO)。无名管道通过内核缓存区实现亲缘进程间通信,具有单向性和继承性特点;有名管道通过文件系统标识实现无亲缘关系进程间通信。两者都采用半双工模式,数据传递后即被删除。管道实现简单轻量,适合少量数据传输,但存在通信方式受限、数据量有限等缺点。使用需注意避免死锁、约定数据格式和权限控制等问题。管道是理解进程隔离与通信机制的重要切入点,在单机轻量级通信场景中具有独特优势。
2026-03-30 21:33:41
422
原创 进程间通信(IPC):原理、场景与选型
本文详细介绍了6种常见的进程间通信(IPC)方式。无名管道(PIPE)和有名管道(FIFO)提供单向/半双工通信,前者限于亲缘进程,后者支持无关进程。信号用于异步事件通知,不传输数据。消息队列支持全双工通信和消息分类。共享内存效率最高但需配合信号量实现同步。Socket支持跨主机通信。每种方式各有特点:管道简单但功能有限,消息队列灵活但效率一般,共享内存最快但需同步,Socket最通用。实际开发中应根据场景选择合适方案:轻量通知用信号,简单交互用管道,异步消息用队列,大数据用共享内存,网络通信用Socket
2026-03-30 20:59:51
422
原创 LeetCode 27. 移除元素:从思路到代码,一篇吃透
LeetCode27移除元素是一道经典的数组双指针练习题。题目要求在原地移除数组中等于给定值的元素,返回剩余元素数量。最优解法是快慢双指针法:慢指针k记录有效元素位置,遍历数组时将不等于val的元素存入nums[k]位置。该解法时间复杂度O(n),空间复杂度O(1)。C++范围for循环版本代码简洁高效,通过引用传递直接修改原数组,返回的k值表示前k个元素为有效结果。这道题是掌握数组原地操作和双指针思想的基础,理解后可轻松应对同类数组问题。
2026-03-29 15:32:07
382
原创 【LeetCode 27. 移除元素】C++ 范围 for 极简实现与原理解析
本文介绍了LeetCode第27题"移除元素"的C++解法,重点讲解了使用范围for循环实现的双指针法。该方法通过慢指针k记录有效元素位置,遍历数组时将不等于val的元素写入数组前部,实现原地修改。文章分析了代码原理、复杂度(时间O(n),空间O(1)),并比较了范围for与传统for的性能差异,指出两者效率相同但范围for更简洁。最后提到可选的首尾双指针优化方案,适用于val出现较少的场景。这道题展示了双指针处理数组问题的基本思路,是学习更复杂算法的基础。
2026-03-29 14:59:20
473
原创 LeetCode 9. 回文数:不转字符串的高效解法
这道题的核心是利用回文数的对称性,只反转后半段数字,既高效又安全。边界过滤:提前排除不可能的情况,减少后续计算。半段反转:避免溢出,同时保证时间复杂度最优。最终判断:兼容偶数位和奇数位两种回文数场景。
2026-03-27 19:46:04
232
原创 经典概率题:飞机座位分配问题(LeetCode 1227)超详细解析
飞机座位分配问题:当n位乘客登机时,第1位乘客随机选座,其余乘客优先坐自己座位(若被占则随机选)。令人惊讶的是,无论n多大(n≥2),第n位乘客坐对座位的概率恒为0.5(n=1时为1)。这一反直觉结论可通过简单推理得出:问题最终归结为第1位和第n位乘客的座位选择,形成对称的1/2概率。
2026-03-27 19:23:41
198
原创 罗马数字转整数:C 语言实现超详细解析(附完整可运行代码)前言
本文讲解了如何用C语言实现罗马数字转整数的算法。核心思路是遍历字符串,比较相邻字符值:当前值小于下一值时执行减法,否则执行加法。关键点包括:1)建立字符-数值映射表;2)正确处理最后一位字符;3)避免常见的加减规则混淆错误。文章提供了完整代码实现和测试用例,特别强调了新手易犯的两个错误:遗漏最后一位字符和搞反加减规则。通过这个练习可以掌握字符串处理和特殊逻辑处理的编程技巧。
2026-03-27 18:06:24
227
原创 Linux静态库与共享库(动态库)详解
本文全面解析Linux程序开发中的静态库(.a)和共享库(.so)的核心概念与使用技巧。静态库在编译时将代码完整嵌入可执行文件,适合独立运行场景;共享库则在运行时动态加载,支持多程序共享。文章通过数学工具库案例,详细演示了两种库的创建、编译链接及运行流程,重点解决了共享库路径配置等常见问题。对比分析了两者在体积、资源占用、更新维护等方面的差异,并给出选型建议:静态库适合稳定独立需求,共享库适合灵活共享场景。最后总结了混合使用策略和命名规范的重要性,为开发者提供了全面的库使用指南。
2026-03-26 21:49:08
723
原创 Linux exec进程替换详解
本文深入解析Linux中的exec进程替换机制,详细介绍了6种exec系列函数的功能差异和使用场景。核心要点包括:exec通过替换进程的代码段和数据段实现程序切换,保持原进程PID不变;不同exec函数在参数传递(列表型/数组型)、路径搜索和环境变量处理上各有特点;典型用法是与fork配合,在子进程中执行替换;文章还总结了参数未以NULL结尾、权限不足等常见错误及解决方法,并揭示了Shell命令执行的底层原理。掌握exec机制对Linux进程编程和系统运维至关重要,需结合实践加深理解。
2026-03-26 21:41:58
478
原创 C++内联函数:彻底搞懂引用内联函数的核心用法
本文详细介绍了C++内联函数(inline)的核心特性与应用场景。内联函数通过编译期代码替换消除函数调用开销,兼具普通函数的安全性和宏函数的效率。文章重点解析了内联函数的本质(编译器请求而非命令)、使用规则(定义必须放在头文件)和最佳实践(适用于短小高频函数),并对比了其与宏函数、普通函数的差异。同时指出了常见误区,如过度内联导致代码膨胀、无法用于递归等问题。最后强调内联函数是替代宏函数、提升性能的重要工具,合理使用能显著优化代码执行效率。
2026-03-25 21:54:31
676
原创 C++函数重载:彻底搞懂引用函数重载的核心用法
C++函数重载允许同名函数共存,条件是参数列表不同(类型、数量或顺序)。核心规则包括:参数差异构成重载,仅返回值或参数名不同则无效。编译器通过名称修饰技术区分同名函数。使用需注意匹配优先级和常见陷阱,如默认参数混用、隐式转换二义性等。重载能简化命名、提升可读性,建议用于功能相似的函数,避免过度使用。掌握重载对学习C++高级特性至关重要。
2026-03-25 21:52:14
396
原创 C++ 默认参数:彻底搞懂引用默认参数的核心用法
C++默认参数详解:简化函数调用的实用技巧 本文全面介绍C++中的默认参数特性,帮助开发者掌握这一简化代码的重要工具。默认参数允许函数在声明时为形参指定默认值,调用时未传入参数则自动使用默认值。文章详细讲解默认参数的基本语法、必须遵守的从右往左设置规则,以及在声明与定义分离时的注意事项。同时列举了默认参数的三大实用场景:简化重复调用、替代函数重载和类构造函数初始化。针对新手常见问题,特别指出4个易错点,包括不能与重载冲突、不能使用局部变量等。最后通过对比默认参数与函数重载的差异,帮助读者在实际开发中做出合适
2026-03-24 21:03:00
502
原创 C++ 引用:彻底搞懂引用的核心用法
本文深入浅出地讲解了C++引用的核心概念与使用场景。引用作为变量的别名,必须初始化且不可重绑定,与原始变量共享内存空间。文章重点分析了引用的三大核心用途:高效函数传参避免拷贝、const保护只读数据、引用返回值支持链式调用,并通过示例代码展示了正确用法。同时,文章详细对比了引用与指针的区别,指出引用更安全但功能受限的特点,并提醒开发者避免常见陷阱(如返回局部变量引用)。最后强调引用在C++高性能编程中的重要性,为后续学习右值引用等高级特性打下基础。
2026-03-24 20:55:54
316
原创 希尔排序:从原理到代码
希尔排序的本质,是「分组优化的插入排序」—— 它利用“大增量让元素快速归位,小增量做精细调整”的思路,解决了直接插入排序移动效率低的痛点。对于新手来说,掌握希尔排序不仅能学会一种高效的排序算法,更能理解「分而治之」的算法思想,为后续学习快速排序、归并排序等高级算法打下基础。最后记住:希尔排序不是最快的排序算法,但它足够简单、足够高效,在中等规模数据场景中,是性价比极高的选择。建议大家亲手敲一遍代码,结合实例跑一遍排序过程,就能真正掌握它~
2026-03-23 21:25:14
354
原创 数据结构:循环链表详解(从原理到实战,新手必看)
循环链表(Circular Linked List)是单链表的一种变体普通单链表:尾节点的next指针指向NULL循环链表:尾节点的next指针重新指向头节点,整个链表形成一个环我们使用带头结点的循环链表,方便统一处理空表和非空表逻辑。// 节点结构体int data;// 数据域// 指针域} Node;// 链表类型重定义(指向头结点)循环链表本质就是首尾相连的单链表核心:尾节点p!= head作为结束条件操作逻辑与单链表几乎一致,更容易处理环形问题。
2026-03-23 19:02:00
343
原创 选择排序:原理、实现与优化
摘要: 本文详细介绍了选择排序算法,包括其核心原理、C语言实现、性能分析和优化方法。选择排序通过"找最值,放位置"的方式将数组分为已排序和未排序区间,时间复杂度始终为O(n²),空间复杂度O(1),是不稳定排序。文章提供了基础实现代码,并介绍了双向选择排序优化方案,通过同时查找最小最大值减少循环次数。该算法适合小数据量、高交换成本场景及编程新手学习,是理解排序基础逻辑的良好入门案例。
2026-03-22 22:40:55
556
原创 数据结构入门:单链表详解(从原理到实战,新手必看)
摘要:单链表是C语言中重要的动态数据结构,通过指针连接独立节点实现线性存储。每个节点包含数据域和指针域,相比数组具有动态扩容、高效插入删除(O(1))和不需连续内存等优势。本文详解了单链表的节点结构定义及核心操作实现,包括初始化、头插/尾插创建、遍历、按位置插入、按值删除和查找等函数。最后总结了单链表的优缺点:动态内存管理、操作高效是其特点,但存在无法随机访问、内存开销较大等局限。掌握单链表对理解数据结构基础至关重要。
2026-03-22 20:24:25
82
原创 从入门到精通:快速排序的核心原理、实现与优化
看到这里,相信你已经彻底搞懂了快速排序的来龙去脉,最后用几句话总结核心要点,帮你快速记忆:核心思想:分治思想,选基准→分区→递归排序;核心优势:平均O(n log n)时间复杂度、原地排序、实际运行速度快;关键实现:原地分区(双指针)、递归终止条件(子数组长度≤1);优化方向:随机化基准、三数取中、小数组切换插入排序、三路分区;局限:不稳定排序、最坏情况时间复杂度O(n²)(可优化规避)。
2026-03-21 17:34:12
550
原创 数据结构入门:顺序表详解(从原理到实战,新手必看)
本文系统讲解了顺序表的核心概念与实现方法。顺序表是基于数组的线性存储结构,具备随机访问、存储密度高等特点,是学习数据结构的入门基础。文章详细分析了动态顺序表的C语言实现,包括初始化、扩容、增删改查等核心操作,并提供了完整代码示例。同时对比了顺序表和链表的优缺点,指出顺序表更适合查询频繁、增删较少的场景。最后总结了新手常见误区,强调理解连续存储特性与动手实践的重要性,为后续学习链表等数据结构打下基础。
2026-03-21 16:45:11
716
原创 深入理解Linux信号:从原理到实操,搞定进程间“通信暗号”
Linux信号是进程间通信的重要机制,用于异步通知进程发生特定事件。本文介绍了信号的基本概念、常用信号类型及其作用,包括SIGINT(2)、SIGKILL(9)、SIGTERM(15)等核心信号。详细讲解了kill、killall等命令的实际应用,以及信号处理的三种方式:默认处理、忽略和自定义处理。文章还总结了常见问题,如滥用SIGKILL导致资源泄露、僵尸进程处理等,并提供了实用避坑建议。通过掌握这些知识,用户可以更有效地管理Linux进程,从基础使用进阶到灵活控制信号处理。
2026-03-18 22:48:45
542
原创 Linux文件管理入门:从“一切皆文件”到实操精通
本文分享了Linux文件管理的核心知识与实用技巧。首先介绍了Linux"一切皆文件"的设计哲学和目录结构,重点讲解了/bin、/etc、/home等核心目录的功能。接着详细讲解了cd、ls、cp、mv、rm等常用文件操作命令,以及权限管理方法。文章还提供了文件搜索、链接创建等进阶技巧,并建议新手从基础命令入手,逐步掌握权限管理和自动化操作。最后强调通过命令行实践才能真正理解Linux文件系统的设计思想,提高运维效率。
2026-03-18 22:43:18
599
原创 吃透僵死进程:从成因到根治,一篇搞定所有坑
Linux僵死进程(Zombie Process)是已终止但未被父进程回收的特殊进程,状态显示为Z或Z+。其核心危害在于耗尽有限的PID资源而非占用CPU/内存。产生原因主要是父进程未正确处理SIGCHLD信号或调用wait()回收子进程。检测方法包括ps命令筛选Z状态进程和top命令监控。处理方案需终止其父进程而非直接kill僵死进程本身。预防措施推荐:1)父进程循环调用waitpid();2)忽略SIGCHLD信号自动回收;3)使用double fork技术。注意区分僵死进程与无害的孤儿进程,少量僵死进
2026-03-17 21:15:50
523
原创 吃透 Fork:从 Git 协作到 Linux 进程,解锁开发者必备技能
本文深入解析编程中"fork"的两大核心应用:Git协作中的Fork功能和Linux系统的fork()函数。Git Fork用于将他人仓库复制到自己账号下独立开发,包含Fork→Clone→开发→同步→PR五步完整流程;Linux fork()则用于创建进程副本,实现并发处理。两者本质都是创建独立可追溯的副本,但应用场景不同。文章还对比了Fork、Clone和Branch的区别,并提供实用技巧,帮助开发者正确使用fork功能,避免常见误区。
2026-03-17 19:00:34
482
原创 Linux 下深挖 printf 缓冲区:从现象到原理,彻底搞懂输出延迟问题
摘要: 本文深入剖析Linux环境下C语言printf函数的缓冲区机制及其控制方法。在Linux中,printf默认使用用户态缓冲区,其刷新规则因场景而异:终端输出为行缓冲(遇\n刷新),重定向时为全缓冲,而stderr始终无缓冲。针对缓冲区导致的输出延迟、日志丢失等问题,文章提出多种解决方案:强制刷新(fflush)、关闭缓冲区(setbuf)、直接系统调用(write)及优先使用stderr。同时分析了多线程输出混乱、管道延迟等常见陷阱,强调理解缓冲区机制对Linux C编程的重要性。掌握这些技巧可优化
2026-03-16 19:56:44
513
原创 Linux基础命令入门:从0到1上手,新手也能轻松拿捏
以上就是Linux最基础、最常用的10个命令,涵盖了目录切换、文件操作、系统查看等日常场景。对于新手来说,不用一开始就掌握所有命令,先把这些基础命令练熟,就能应对大部分简单的系统操作。后续我还会分享更多Linux进阶命令(比如权限管理、进程管理),感兴趣的可以关注~ 如果你是Linux新手,不妨从今天开始,打开终端,试着输入上面的命令,感受命令行的魅力吧!最后提醒:实践是掌握Linux命令的关键,多动手、多尝试,遇到问题多查提示,你会发现Linux其实很简单~
2026-03-16 19:02:42
398
原创 【蓝桥杯】特别数字的数之和
本文解析了一道编程题目:计算1到n之间所有包含数字2、0、1、9的数的总和。通过拆解问题为筛选和求和两个步骤,详细介绍了逐位提取数字的判断方法。提供了完整的C语言实现代码,包括核心的筛选函数和主函数逻辑。通过样例测试验证了代码的正确性,并讨论了时间复杂度和可能的优化方向。最后指出这类题目重点考察数字逐位处理能力,是编程基础训练的重要内容。解题思路清晰,代码实现简洁,适合编程初学者学习数字处理的常见方法。
2025-11-05 20:18:54
686
原创 手把手解决“饮料换购”问题:逻辑推导与代码实现
本文解析了经典编程问题"饮料换购"的解题思路。首先明确题目规则:初始购买n瓶饮料,每3个瓶盖可换1瓶,循环兑换直至不足3个。通过分析错误代码示例,展示了正确的循环逻辑实现方法。文中提供了完整的C++代码实现,并通过多个测试案例验证了算法的正确性。还探讨了规则变化时的通用解法,强调了将具体问题抽象为循环兑换模型的核心思路,为类似编程问题提供了可扩展的解决框架。
2025-11-05 19:43:43
416
原创 冒泡排序:最简单的排序算法,看完这篇就懂了
冒泡排序是一种基础交换排序算法,通过反复比较相邻元素并交换顺序错误的元素,将较大元素逐步"冒泡"至数组末端。其过程示例展示了从[5,2,9,3,6]到[2,3,5,6,9]的排序步骤,包含优化策略(无交换时提前终止)。该算法实现简单(附C语言代码)、空间复杂度低(O(1))且稳定,但时间复杂度为O(n²)效率较低。适用场景包括小规模数据、基本有序数据或教学演示,实际应用中更多作为理解排序思想的入门案例。
2025-11-04 21:23:35
664
原创 深入理解 Swap:从基础交换到编程艺术
文章摘要:Swap操作是编程中基础但重要的数据交换方法。常用实现方式包括:临时变量法(安全通用)、算术运算(可能溢出)和异或运算(高效但局限)。Swap应用广泛,从简单数值到复杂数据结构都可使用。关键注意事项:避免同地址交换、浮点数需用临时变量法、指针传递才能修改原值。临时变量法是最安全的选择,而异或法适合整数优化场景。掌握Swap原理对算法实现和性能优化具有重要意义。
2025-11-04 16:31:41
1970
原创 回文数的判断与 C 语言实现
本文详细讲解了回文数的概念及其C语言实现方法。回文数是指正反读相同的整数,如121、1331等。文章介绍了三种判断方法:直接反转法(简单但需注意溢出)、反转一半数字法(最优解,避免溢出)和字符串转换法(思路简单但效率略低),并分析了各自的优缺点和适用场景。特别强调了边界情况处理和溢出问题,指出反转一半数字法在实际开发中的优势。回文数判断在数据校验、密码检测等领域有实际应用,掌握多种解法有助于培养编程思维。
2025-10-29 20:51:08
1023
原创 深入浅出理解斐波那契数列与 C 语言实现
本文介绍了斐波那契数列的数学原理及其在C语言中的三种实现方法:递归法(直观但低效)、迭代法(高效实用)和数组缓存法(空间换时间)。详细分析了各方法的复杂度特点与适用场景,并指出实际开发中的注意事项,如数据类型选择和输入验证。斐波那契数列不仅是算法学习的重要案例,在金融、自然模拟等领域也有广泛应用。通过对比不同实现方案的优劣,帮助开发者根据具体需求选择最优算法。
2025-10-29 20:40:07
759
原创 用 C 语言解决 “猴子吃桃” 问题:从递推到递归的实现
猴子吃桃问题通过逆向思维求解桃子总数。已知第10天剩1个桃子,根据每天吃一半加一个的规律,推导出前一天的桃子数为2*(后一天数量+1)。采用循环递推从第9天反推到第1天,得出第一天摘了1534个桃子。此问题展示了逆向推导在解决递推问题中的优势,循环实现效率高,递归则更直观体现数学关系。两种方法各有优劣,需根据实际场景选择。
2025-10-28 18:50:15
497
原创 C 语言实现字符串压缩:从思路到代码详解
include <string.h> // 用于strlen函数// 存储输入字符串(预留结束符位置)// 存储压缩后的字符串int k = 0;// target数组的当前下标(记录已存入字符数)// 读取输入字符串// 计算原始字符串长度。
2025-10-23 20:22:17
442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅