- 博客(14)
- 收藏
- 关注
原创 Git 入门到进阶:从零掌握版本控制与协作开发
Git是分布式版本控制系统,通过本地保存多个版本、提交记录实现代码管理。使用流程为:初始化仓库(git init)、修改文件、添加至暂存区(git add)、提交(git commit)、关联远程仓库(git remote add)并推送(git push)。需配置用户信息(git config --global user.name/email),用于标识提交作者。提交记录中的邮箱可关联GitHub贡献图。Git有工作区、暂存区、版本库三区,状态由git status查看。通过git log查看提交历史,用
2026-10-13 01:01:23
195
原创 STM32CubeMX配置STM32F103C8T6超详细教程
本文以STM32F103C8T6为例,介绍了使用STM32CubeMX配置开发环境的步骤:首先下载安装CubeMX和Keil_v5(或STM32CubeIDE);接着在CubeMX中选择芯片型号,配置外部时钟(HSE/LSE)为晶振模式(如有8MHz/32.768kHz晶振),设置Debug为SerialWire;然后配置GPIO和时钟树(8MHz晶振9倍频至72MHz);最后在Project Manager中设置项目名称、IDE类型(MDK-ARM),并建议勾选"按外设拆分初始化代码"
2026-07-30 20:40:26
189
原创 【数据结构与算法】哈希表实战例题
本文介绍了C++中map和unordered_map的底层实现、性能差异及适用场景,并通过三道典型题目展示了它们的实际应用。map基于红黑树实现,保持元素有序但操作复杂度为O(logn);unordered_map基于哈希表,操作平均复杂度为O(1)但无序。题目实战包括:两数之和(哈希查找)、和为K的子数组(前缀和+哈希统计)和字母异位词分组(哈希分类)。此外还介绍了C++11的范围for循环和C++17的结构化绑定语法,这些特性可提升代码简洁性和可读性。
2026-07-18 20:23:30
215
原创 位运算核心操作与题目实战:从原理到C语言实现
本文介绍了位运算的基本概念、常用运算符和核心操作。位运算通过直接操作二进制位,可以实现运算优化、硬件寄存器访问和内存占用优化。核心操作包括置位、清零、取位和翻转四种基础操作,每种操作都通过掩码和位运算符组合实现。文章提供了多个实战例题的C语言实现代码,包括打印32位二进制数、反转二进制位、十进制转16进制,以及利用位运算找出数组中仅出现一次的数字。特别地,对于出现三次的数字问题,通过位计数器(ones和twos)的组合使用,在O(1)空间复杂度内高效解决了问题。这些示例展示了位运算在算法优化中的强大作用。
2026-07-18 11:16:26
230
原创 C语言内存管理深度解析:虚拟地址空间、动态分配与栈溢出漏洞一网打尽
本文摘要: 内存与硬盘区别:硬盘断电数据保留,内存断电数据丢失。程序运行时需从硬盘加载到内存。 内存管理重要性:内存是稀缺资源,尤其嵌入式设备内存有限。主要任务是防止内存泄漏(分配后未释放)。 内存泄漏防范: 用户自行管理(高效但依赖经验) 系统GC机制(安全但开销大) Linux虚拟地址空间: 栈空间:存局部变量/返回地址(易溢出风险) 堆空间:动态分配内存(用户管理) 数据段:存全局/静态变量 代码段:程序指令 介绍了内存分配函数
2026-07-17 20:37:00
165
原创 C语言未定义行为详解:i++ 与 ++i 混合运算的那些坑
摘要:本文通过四个C语言示例代码,分析了自增运算符(++i/i++)在表达式中的未定义行为。这些示例展示了不同编译器可能产生不同结果的情况,如num=8或14、num=19等。特别强调这些写法在正式项目中应严格避免,属于不可移植的未定义行为。建议将自增操作与表达式分离,如先执行i++再计算sum=i+5,以提升代码可读性和可靠性。文章旨在警示开发者规范使用自增运算符,避免依赖编译器特定实现的行为。(149字)
2026-07-16 19:15:55
216
原创 【离散数学】传递闭包运算公式的证明
这篇文章探讨了二元关系传递闭包的计算公式证明过程。作者从最初的有限并集表达式出发,发现当指数超过集合大小时存在理论漏洞。通过引入无限并集的概念,使用数学归纳法证明了其传递性,并确立了最小性。关键突破在于发现路径长度超过集合元素数量时必然存在环,从而将无限并集简化为有限并集。最终严密证明了传递闭包的计算公式 $t(R)=R\cup R^2\cup\cdots\cup R^n$(n为集合大小)。整个证明过程展现了从发现问题到创造性解决的完整思路,体现了数学证明的严谨性与优美性。
2026-07-16 10:41:20
247
原创 C 语言预处理全面总结(2):条件编译指令、debug_msg、头文件保护一网打尽
本文介绍了C/C++中预处理指令和条件编译的应用。主要讲解了#if、#ifdef、#ifndef等条件编译指令的用法,以及如何通过-D选项在编译时定义宏。重点阐述了条件编译在代码调试中的应用,通过定义调试宏(如__DEBUG__)来控制调试信息的输出,相比运行时开关能减少性能开销。文章还讲解了头文件重复包含的问题及其解决方案,包括传统的#ifndef保护和较新的#pragma once方法。这些技术能有效提高代码的可维护性和调试效率,是C/C++开发中的重要技巧。
2026-07-15 16:51:28
351
原创 【C语言深扒】从底层二进制看数据流动:深入探讨原反补码、整数提升与截断机制
本文介绍了原码、反码和补码的概念及其转换关系,并通过4个C语言示例演示了补码在实际编程中的应用。其中涉及截断机制、整数提升、有符号数溢出处理等底层原理,解释了-3、-128、127等特殊结果的产生过程,以及字符串长度计算中遇到的补码截断问题。这些示例展示了补码表示法在计算机系统中的重要作用,特别是在处理数据类型转换和数值溢出时的行为特点。
2026-07-15 16:22:21
183
原创 C语言数组进阶,深入浅出
本文系统讲解了C语言中数组的相关知识,主要内容包括:1. 数组的基本概念:静态分配、内存连续特性;2. C99可变长数组的使用限制;3. 数组名的特性:在表达式中退化为指针常量,不能自增自减;4. 数组与指针的关系:一维、二维、三维数组的地址运算和元素访问方式;5. 数组指针与指针数组的区别与应用场景;6. 多维数组作为函数参数的传递方式;7. 数组使用中的注意事项:局部指针数组的初始化、内存管理等。文章通过大量代码示例详细阐述了数组的底层原理和实际应用技巧。
2026-07-06 23:17:50
192
原创 C语言指针深入浅出
本文系统地介绍了指针的概念、操作及注意事项。首先解释了指针的本质是保存内存地址的变量,其长度固定但步长随数据类型变化。通过实例详细说明了指针的声明、间接运算符()和取地址运算符(&)的使用,以及指针运算和赋值规则。文章还探讨了多级指针、指针间运算、void万能指针的使用方法及其限制。最后区分了野指针、空指针和悬空指针的概念,并列举了典型错误示例。全文强调指针类型匹配的重要性,并指出不当使用指针可能引发的内存问题,为正确使用指针提供了全面指导。
2026-06-23 00:48:00
186
原创 C语言static与extern关键字
本文介绍了C语言中static和extern关键字的核心作用及使用场景。static可修饰局部变量、全局变量和函数,主要功能是控制变量的生命周期(延长局部变量至程序结束)和限制作用域(使全局变量和函数仅在当前文件可见)。extern用于声明外部定义的变量或函数,分为.h文件中的"对外声明接口"和.c文件中的"临时使用声明"。两者在链接属性上相反:static隐藏符号,extern跨文件访问符号。文章通过代码示例展示了正确用法,特别强调不要在头文件中初始化extern变
2026-06-19 18:37:10
163
原创 C语言register关键字与volatile关键字
CPU由运算器、控制器和存储器(寄存器、三级缓存)组成。寄存器存储CPU正在计算的数据,缓存存储未来可能要计算的数据。register关键字建议将频繁使用的局部变量存入寄存器以提高访问速度,但现代编译器已能自动优化。volatile关键字则防止编译器优化,确保变量始终从内存读取,常用于可能被外部改变的全局变量。两个关键字分别涉及寄存器的使用与避免,对程序性能优化有重要作用。
2026-06-17 23:48:13
158
原创 C 语言预处理全面总结(1):宏、#、##、do...while(0) 一网打尽
本文详细介绍了C语言预处理阶段的关键概念和技术要点。主要内容包括:1) 预处理三大任务(头文件展开、宏替换、条件编译)及gcc-E指令的使用;2) 头文件搜索路径规则(系统目录与自定义目录);3) 宏定义的"傻瓜式替换"特性及注意事项,包括使用括号解决运算符优先级问题;4) 宏定义的实际应用场景(消除幻数、定义宏函数);5) 宏函数与普通函数的性能比较;6) #和##运算符的特殊用法;7) 内置宏的使用;8) typedef与#define的区别
2026-04-24 01:42:51
570
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅