- 博客(46)
- 收藏
- 关注
原创 上手就会的Markdown 格式
Markdown是一种轻量级标记语言,专注于简化文本格式标记过程。它通过简单的符号实现标题(#)、加粗(**)、斜体(*)、删除线(~~)、代码块(```)等常见排版效果,支持有序/无序列表、引用(>)和分割线(---)。这种纯文本标记方式让作者可以专注于内容创作,同时保持文档结构清晰。作为开发文档的标准格式,Markdown文件(.md)易读易写,兼容性强,甚至可用记事本编辑,专业编辑器如Obsidian能提供更好的编写体验。其核心优势在于用最简语法实现高效排版,大幅减少格式调整的时间成本。
2026-04-14 14:48:57
79
原创 为你的claude 创建永久使用的skill
摘要:为Claude创建永久使用的Skill 本文介绍了如何为Claude创建可永久使用的Skill,解决每次使用需要重复安装依赖的问题。Skill作为Claude的扩展包,可安装在用户目录(~/.claude/skills/)下实现一次安装、全局使用。
2026-04-14 12:55:47
617
原创 使用AVL平衡树和列表实现 map容器 -- 附加测试/python代码
本项目实现了基于AVL树和有序列表的Map结构,用于单词频率统计。AVLMap继承AVLTree特性,通过自动平衡保持O(log n)的操作性能;ListMap则采用有序列表和二分查找,适合小规模数据。项目展示了继承和多态的应用,统一接口设计使不同数据结构可互换。性能测试显示:哈希表最快,AVLMap次之,ListMap较慢。项目还包含AVL树的旋转平衡实现、调试经验分享和完整测试方案,有效演示了数据结构的选择与实现。
2026-04-10 14:28:07
227
原创 在 Surface Pro X (ARM64) 上成功部署 Claude Code 的完整复盘
这是一篇关于在 Surface Pro X (ARM64架构) 上从零到一成功部署 Claude Code 的完整实战记录。文章详细记录了部署过程中遇到的所有“坑”与破解之道:从误下错误的安装脚本,到补全 Git bash和 Node.js 核心依赖;从 PATH 环境变量的反复折腾,到最终打通 MSYS2 终端与 Windows 世界的连接;从国内信用卡支付屡屡被拒,到巧用 美区 Apple ID + 礼品卡 成功订阅的完整攻略。
2026-03-19 18:15:49
1249
原创 人机交互GUI——组件 “失去焦点” 行为详解
摘要:本文通过一个简单的APP界面示例,解释了"失去焦点"的概念及其在交互设计中的应用。当用户从一个可交互组件(如输入框)切换到另一个组件时,原组件即"失去焦点"。文章通过三个组件(文本输入框、按钮、标签)的代码演示,说明click事件在点击时立即触发,而change事件仅在组件值改变且失去焦点时触发。测试案例显示,当输入框内容未改变时,即使失去焦点也不会触发change事件。这种机制有助于区分用户"查看"和"真正修改"的行为,
2026-02-28 21:43:06
680
原创 指向指针的指针(二级指针)int **p 作为参数的作用
本文通过四个函数示例演示了C语言中指针参数的不同用法:1) func0展示值传递无法修改外部变量;2) func1通过一级指针修改指针指向的值;3) func2说明一级指针参数无法修改指针本身;4) func3使用二级指针成功修改指针指向。重点分析了链表归并排序中的list_split函数,指出必须使用Node**参数才能正确返回分割后的子链表。核心结论:要修改指针本身必须传递指针的地址(二级指针),仅传递指针(一级指针)只能修改指针指向的内容。
2026-02-20 13:51:55
624
原创 一个支持在线deBug的编辑器/调试器功能详解
OnlineGDB是一款便捷的在线编程工具,支持多种语言(C/C++/Java/Python等)的编辑、编译和调试。它提供断点设置、单步执行等调试功能,界面友好且支持协作分享。对于多文件项目,可通过创建项目、编写文件后使用Debug控制台执行终端指令(如make命令)进行编译运行。调试时若无法直接点击设置断点,可先在Debug控制台输入指令(如break 130)激活调试环境,再使用run/next等命令操作。该工具尤其适合需要随时随地进行简单代码测试或协作的场景。
2026-02-17 11:39:31
2102
原创 CPU眼中的i++ 与 ++i
文章摘要:从CPU指令层面分析++i和i++的性能差异。测试显示,对于简单数据类型(int等),两者在多数情况下生成的汇编指令相同或相近,性能差异可忽略。但当涉及函数返回值或复杂对象时,i++需要构建临时变量,导致额外指令开销。特别是在C++类对象操作中,i++往往包含完整的++i操作且难以被优化。建议:基本类型可随意使用,但处理复杂对象时应优先选择++i以获得更好性能。
2026-02-16 17:58:43
552
原创 Valgrind 测试详解--检测内存泄漏的好工具
printf("\n2. 条件内存泄漏 (flag=0):\n");printf("=== 内存泄漏示例 ===\n\n");printf("=== 修复后的版本 ===\n\n");printf("1. 基本内存泄漏:\n");printf("\n3. 部分释放:\n");// 只释放了指针数组,但没有释放每行的内存。printf("\n程序结束\n");// 修复:先释放每行,再释放指针数组。printf("\n程序结束\n");
2026-02-15 12:15:00
624
原创 char **str 要怎么使用?
摘要:本文详细解析了C语言中的双重指针charstr,阐述了其作为"指向字符指针的指针"的基本概念和内存布局,通过具体地址示例展示了指针数组与字符串的存储关系。重点介绍了三种常见使用场景:指向指针数组、动态二维数组和函数参数传递,比较了char*b[3]与charc的区别。文章还对比了二维数组与指针数组的内存存储特点,分析了各自的优缺点,并列举了常见的错误用法,包括未初始化、指针混淆和内存泄漏等问题。最后通过等价写法示例展示了不同访问方式的关联性。
2026-02-14 19:03:49
668
原创 C语言没有Vector? 那就自己写一个呗!
本文介绍了一个整数向量(vector)的抽象数据类型(ADT)实现。向量作为动态数组,支持运行时调整大小,包含创建、销毁、调整大小、插入、删除元素等操作。通过头文件vector.h定义结构体和接口函数,在vector.c中实现具体功能,包括内存管理、边界检查等。使用时需包含头文件,通过指针操作向量元素。文章还指出了常见错误(如传递空指针导致段错误)及防范措施,展示了基本用法示例。该实现提供了比静态数组更灵活的数据存储方案。
2026-01-31 21:24:49
360
原创 数组名arr 到底跟 指针(地址) 有啥区别呢?
本文探讨了C语言中数组名与指针的区别。虽然数组名在大多数情况下会退化为指向首元素的指针,但二者存在本质差异:数组名是地址常量而非变量,不能赋值或自增;sizeof运算返回数组总大小而非指针大小;&arr与arr地址相同但类型不同,导致指针运算单位差异。通过内存布局分析和实例演示,文章阐明了数组名作为编译时常量的特性,以及它与指针变量在内存位置、存储方式、运算规则等方面的根本区别。最终结论是:数组名是数组类型的标识符,在表达式中退化为指针右值,但不能等同于指针变量。
2026-01-23 19:21:39
550
原创 什么是字面量?代码中的常量表示方式解析
本文详细介绍了字符串字面量的概念、特性及使用注意事项。字符串字面量是直接写在代码中的字符串,存储在内存只读数据段(.rodata),具有只读性、程序生命周期和可能被合并的特性。与字符数组相比,字符串字面量不可修改,返回其指针是安全的。文章通过示例展示了字符串字面量与字符数组在内存布局、可修改性和地址唯一性等方面的差异,强调了使用const声明的重要性。同时指出了常见错误,如修改字符串字面量、错误比较等,并提供了正确做法。最后通过对比表格总结了二者的关键区别,并给出记忆口诀,帮助理解字符串字面量的本质和使用场
2026-01-21 20:49:14
787
原创 野指针的诡异行为----几种常见的野指针行为分析
野指针是指向无效内存的指针,常见于未初始化指针、指向已释放内存、函数返回局部变量地址或数组越界等情况。其行为不可预测,可能导致程序崩溃、数据损坏或间歇性错误。避免方法包括初始化指针为NULL、释放后立即置空以及明确内存所有权管理。典型示例展示了野指针可能读取到幽灵值或引发海森堡bug等诡异现象。正确处理指针生命周期是预防这类问题的关键。
2025-12-31 08:27:43
543
原创 回调函数还有这么多好处呢?!----C回调函数详解
本文通过代码示例展示了回调函数的核心概念与优势。回调函数通过函数指针实现,将通用逻辑(如遍历)与具体操作(如打印、加倍)解耦,提高代码复用性。典型应用包括数组处理(过滤、排序)等场景,支持同步和异步调用模式。相比C++模板方案,C语言通过void*指针实现类型通用性,而C++则依赖模板的编译时多态。回调函数是构建模块化、可扩展系统的关键工具,广泛应用于GUI、网络编程等领域。
2025-12-26 12:20:36
956
原创 C语言 通用型指针 void* 详解 + 小习题
通用型指针void是C语言中的一种特殊指针类型,它可以存储任何类型数据的地址但不知道具体类型。主要特性包括:通用性(可指向任何类型)、无类型信息、不能直接解引用或进行算术运算,但可以比较地址和强制转换。使用void时需要显式类型转换,常见于内存操作函数、动态内存分配、回调接口和数据结构实现等场景。使用时需注意类型匹配,避免直接解引用和算术运算,确保类型安全。void*提高了代码的通用性和灵活性,但需要谨慎处理类型转换以避免潜在问题。
2025-12-25 13:48:05
909
原创 异常为什么要捕捉?------Java异常处理机制
本文探讨了Java异常处理机制,通过实例分析了未处理异常导致程序崩溃的问题。文章展示了try-catch结构如何捕获FileNotFoundException等特定异常,并详细解释了异常对象的使用方法。针对多种异常情况,提出了多catch块的处理方案,并介绍了try-catch-finally和throws声明两种异常处理方式。文中强调合理处理异常对保证程序完整执行的重要性,为开发者提供了实用的异常处理实践指导。
2025-12-20 21:07:22
221
原创 结构体有深拷贝么?什么时候需要深拷贝?
本文探讨了C++中深拷贝与浅拷贝的核心概念。当结构体/类只包含基本数据类型时,拷贝操作是安全的成员拷贝(值拷贝)。但当包含原始指针管理动态内存时,浅拷贝会导致多个对象共享同一内存,引发双重释放等问题。深拷贝通过复制指针及其指向的数据来解决这一问题。文章通过Student结构体的演变,展示了如何实现深拷贝构造函数和赋值运算符,并解释了编译器自动生成函数的规则。最后指出三五法则的重要性:管理资源的类需要完整实现五个特殊成员函数。结构体和类在拷贝行为上没有本质区别,只是教学惯例多用class演示这些概念。
2025-12-18 12:33:55
754
原创 关于方法重载的细节--Java静态绑定和歧义调用
本文分析了Java方法重载的编译机制。示例代码包含两个重载的product方法(参数类型分别为int,double和double,int),当main方法中调用product(aa,aa)时会产生歧义调用错误,因为两个int参数均可通过自动类型转换匹配两个方法,导致编译错误。而仅保留方法定义时能正常编译,因为编译器分阶段处理:先检查方法声明(允许合法重载),再检查方法调用(使用时才验证匹配性)。
2025-12-05 20:07:39
572
原创 算符重载 operator < 的返回值如何被使用
本文探讨C++运算符重载在自定义类型比较中的应用。通过定义apple结构体的operator<,使程序能比较其成员变量a的大小。std::sort默认使用operator<进行升序排列,当A.a<B.a为true时,A排在B前(不交换)。这与直觉可能相反,但符合STL约定:返回true表示元素顺序正确。
2025-11-25 11:37:05
875
原创 既然都include了,为什么还要namespace
C++命名空间(namespace)是解决大型项目中名称冲突的重要机制。本文通过引入include 概念,进行了对比,强调了命名空间概念存在的必要性。它通过创建不同的声明区域,允许相同名称在不同命名空间中独立存在。命名空间的价值体现在:避免命名污染,实现库版本管理,以及支持多库共存(如Boost与标准库)。常见用法包括:按模块划分命名空间(如StringUtils、MathUtils)、嵌套命名空间(Company::Project::Module),以及企业项目中严格划分的模块化设计。
2025-11-19 10:38:20
670
原创 先编译后运行,那编译之前呢?
这篇文章详细讲解了C/C++程序的完整编译过程,分为预编译、编译、汇编和链接四个阶段。首先通过预处理展开头文件和宏定义,生成.i文件;然后编译器将预处理后的代码转换为汇编代码.s文件;接着汇编器生成二进制目标文件.o;最后链接器合并目标文件,解析外部引用,生成可执行文件。文章以简单的box/apple程序为例,展示了每个阶段的具体操作和转换结果,并解释了头文件(.h)与实现文件(.c)分离的必要性。整个过程揭示了从源代码到可执行程序的完整转换流程。
2025-11-16 13:39:11
692
原创 Mac 目录树结构与基础 Linux 指令指南
作为开发者,理解操作系统目录结构和掌握基础命令行操作是必备技能。本文将系统介绍 macOS 的目录树结构以及常用的 Linux 指令,建立系统性的知识框架。
2025-11-16 12:12:47
988
原创 C时代的缺陷--烦死人的类函数宏 #define SQUARE(X) X*X
本文探讨了C语言中#define预处理指令和宏定义的使用方法与常见问题。文中通过多个示例展示了明示常量和带参宏(类函数宏)的应用,特别指出了类函数宏存在的调试困难和未定义行为等严重缺陷。重点分析了宏展开导致的优先级陷阱、参数多次求值等问题。
2025-11-14 20:24:31
690
原创 字符串常量池String-Pool是干啥的?声明String到底new 不 new?
该Java程序演示了字符串在内存中的存储机制。主要介绍了内存堆中普通对象和字符串常量置放的空间机制。尤其讲解了在创建字符串时使用还是不使用new算符的区别。另外更加提及了在编译时刻,编译器会检查并处理全部程序里出现的字符串字面量,这一步骤常常被初级学习者所忽略。
2025-11-07 19:22:00
558
原创 Java数组存储机制与引用原理深度解析
Java数组在内存中作为对象存储在堆区,数组变量则作为引用存储在栈区。数组对象包含对象头、长度字段和连续存储的元素数据。访问元素时通过引用定位对象并计算偏移量,确保安全访问。Java引用是受限制的指针,提供类型安全但禁止指针运算,隐藏底层细节以提高安全性。与C/C++不同,Java不允许直接获取实际内存地址。这种设计简化了编程模型,避免了内存错误的风险。
2025-11-06 12:38:19
305
原创 为什么arr[i]被理解为:arr + (i * sizeof(int))
摘要:本文探讨C语言中指针与数组的关系。指针通过地址操作提高效率,且编译器自动处理数据类型大小偏移。数组访问arr[i]本质是*(arr+i)的语法糖,甚至可写作i[arr]。此外:数组名不是指针变量,理解这些特性对掌握C语言底层机制至关重要。
2025-11-05 14:20:12
1102
原创 到底什么是:对称加密/非对称加密--公钥和密钥(下)
本文通过具体案例探讨非对称加密中公钥和私钥的设计原理。以密码118为例,当公钥a=27、私钥b=2963时,其乘积80001(即80000+1)能确保118×a×b的结果末三位仍为原密码。研究表明,只要a×b满足(x×10^y+1)的形式(如80001、1001等),就能保护y位密码不被泄露。前提是通信双方需约定y的取值范围。此外,验证发现当a×b末三位非001时,该方法可能失效,如009时就无法准确还原密码。这揭示了密钥设计中数学关系的重要性。
2025-11-01 19:20:00
453
原创 ++a+a++到底得什么?
本文通过++a+a++; 的一句表达式,来分析,C++/Java 语义规则。其重点探讨,未定义行为:程序行为不确定,可能产生任何结果。和另一个重要概念序列点:程序执行中的一些点,用于确保副作用的完成顺序,从而避免未定义行为。在C++中,如果一个表达式多次修改同一个变量且没有序列点分隔这些修改,或者在一个表达式中修改一个变量并使用它的值(且没有序列点分隔),那么就会导致未定义行为。
2025-10-28 13:13:37
1029
原创 到底什么是:对称加密/非对称加密--公钥和密钥(上)
本文比较了密钥(key)和密码(password)的区别,介绍了密钥和密码使用的场景。文章还介绍了对称加密(相同密钥)和非对称加密(公钥/私钥对)的原理,通过快递情书等生活化例子说明其应用场景和优缺点。最后提出公钥/私钥设计的巧妙算法问题,为下篇博客埋下伏笔。
2025-10-24 20:35:12
1051
原创 学习使用Clion--Clion指南(一)-入门导览/认识基本界面
本文介绍了Clion集成开发环境的基本使用方法。主要内容包括:1)如何运行程序,包括工具栏运行按钮和运行配置设置;2)项目视图和文件管理功能;3)程序构建和工具链配置;4)界面外观设置;5)调试工具的使用方法。文章旨在帮助初学者快速掌握Clion的基本操作,包括项目打开、代码编辑、程序运行和调试等核心功能,为后续更复杂的开发工作打下基础。
2025-10-20 22:14:05
387
原创 Java类与对象——对象的地址
本文阐述了Java中对象引用的概念。通过Student类示例说明,使用new创建对象时,系统会分配内存地址存储对象数据,而变量存储的是该地址引用而非对象本身。原始类型直接存储值,对象类型则存储实例地址。new操作符返回对象实例地址,引用变量指向该地址而非包含对象数据。
2025-10-20 22:11:04
272
原创 C/C++多文件组织结构详解(下)--从编译到构建的完整指南
本文介绍了C++多文件项目的构建方法,从手动编译、CLion集成环境到Makefile自动化构建。首先展示如何通过g++命令手动编译和链接多个源文件,说明其繁琐性;然后介绍CLion中基于CMake的一键构建方式,解释CMakeLists.txt的作用;最后详细讲解Makefile的编写和使用,重点说明其依赖检测和增量构建的优势。文章还对比了不同开发场景下的工作流程,并解析了编译、链接和构建的核心概念。通过这三种方法,读者可以全面理解多文件项目的构建原理,掌握现代化开发工具的高效使用方法。
2025-10-20 15:00:02
1120
原创 如何理解main()的参数-argv/argc
解释main函数的参数,进而理解交互模式和批处理模式下,main函数参数对程序的运行的影响,本文从终端和环境2种模式下分别讲解了运行程序时,main 函数的参数设计。
2025-10-18 13:15:27
551
原创 来说说Java的类和对象:Class Vs. Object
本文主要讲解了java类和对象概念的区别以及java引用类型和内置类型的区别。重点讲解了引用类型在内存空间的存储形式,以及在声明引用类型的对象时,具体的步骤(涉及到构造函数)。
2025-09-28 20:40:11
675
原创 Clion无法在Microsoft Surface pro X -ARM64架构下完成debug工具链的设置
工具链 (Toolchain): LLVM-MinGW (下载于 GitHub releases, 文件 `llvm-mingw-20231122-ucrt-aarch64.zip`), 解压至 `C:\llvm-mingw-ucrt-aarch64\`.已确认这是一个架构匹配问题:目前使用的是 ARM64 的 CLion、ARM64 的 LLVM-MinGW 工具链(包含 `clang++.exe` 和 `lldb.exe`)。:CLion 对其自带工具(包括捆绑的 GDB)有特定的集成和优化。
2025-09-22 22:02:25
1119
原创 App设计入门——如何使用设计模式
这篇文章介绍了在AppLab中使用DesignToolbox制作页面的基本方法。主要内容包括:1)通过拖拽添加和修改页面元素(图片、按钮、文本框等);2)使用预设主题快速调整整体风格;3)自定义颜色和字体;4)插入本地图片或网络图片;5)添加图标元素;6)合理命名元素(使用驼峰命名法)以提高可读性。文章强调了一些不可更改的约束条件,如元素基础类型和画布限制。这些功能可以帮助用户快速创建个性化的应用界面。
2025-09-15 20:39:07
279
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅