- 博客(42)
- 收藏
- 关注
原创 【Linux】进程的“世界观”:环境变量与地址空间
本文主要介绍了环境变量和进程地址空间的概念。环境变量是操作系统运行环境的重要参数,PATH等变量帮助系统查找可执行程序。文章分析了环境变量的获取方式,包括命令行参数、getenv()函数和environ变量。同时探讨了进程地址空间的本质,指出用户使用的都是虚拟地址,操作系统通过页表实现虚拟地址到物理地址的映射。重点阐述了写时拷贝机制如何保证进程独立性,以及地址空间如何实现对物理内存的保护。最后解释了进程创建时内核数据结构与代码加载的顺序关系,说明了地址空间管理对系统稳定性的重要意义。
2026-03-18 16:06:54
344
原创 【Linux】深入理解进程:进程状态,进程优先级,进程切换与O(1)调度算法
本文深入探讨了Linux进程管理的核心概念。主要内容包括:1)进程状态(运行、阻塞、挂起、僵尸、孤儿状态)及其转换机制,重点阐述了进程在不同队列间的流动本质;2)进程优先级管理,解释了PRI和NI的关系及调整规则;3)进程切换原理,包括上下文保存和O(1)调度算法实现细节。文章通过源码分析和实例演示,揭示了Linux内核如何通过精巧的数据结构设计(如双向链表、位图等)高效管理进程,确保系统资源合理分配的同时兼顾公平性和响应速度。特别强调了僵尸进程导致的内存泄漏问题及解决方案,为深入理解Linux进程管理机制
2026-03-18 14:58:53
489
原创 【Linux】理解进程,从这三件事开始:冯诺依曼、操作系统、PCB
本文围绕计算机系统核心概念展开:1. 冯诺依曼体系结构解析了计算机硬件组织方式,强调内存作为CPU与外设间的速度适配器,解释了程序必须加载到内存运行的原因。2. 操作系统部分阐明了其作为管理软件的双重角色:向下管理硬件资源,向上为用户程序提供执行环境,并介绍了系统调用的访问机制。3. 进程概念部分详细说明了进程是PCB数据结构与代码数据的结合体,操作系统通过管理PCB链表来实现进程管理,并深入讲解了fork()系统调用创建子进程的过程及其返回值设计原理。全文重点在于理解计算机系统的层次化管理机制,特别是操作
2026-03-13 16:33:58
492
原创 Linux开发工具入门(一):开发三板斧(包管理器,vim,gcc/g++) 以及入门理解动静态库
本篇是 Linux 开发工具入门指南,文章围绕“写代码 → 编译 → 运行”这一主线,系统介绍了 Linux 环境下最核心的三类工具:包管理器:以 apt 和 yum 为例,讲解如何一键安装开发环境,并理解其背后的依赖解决机制。编辑器 vim:从模式切换、基本操作到简单配置,让你能在终端里流畅地编写代码。编译器 gcc/g++:通过实际示例演示从源文件到可执行文件的完整过程,并深入讲解预处理、编译、汇编、链接四个阶段。动静态库入门:用生活化的比喻解释静态库(.a)和动态库(.so)的区别,以及它们各自的优点
2026-03-13 15:47:26
451
原创 Linux入门:权限管理的核心逻辑
摘要:本文系统介绍了Linux权限管理的核心概念与操作方法。主要内容包括:1) Linux用户分类(root/普通用户)及切换方式;2) 权限本质(角色+目标属性)与文件访问者分类(拥有者/所属组/other);3) 权限位表示方法(rwx)及chmod命令使用;4) 特殊权限设置如chown/chgrp和粘滞位;5) 权限掩码umask的作用与修改;6) 目录权限特点及用户间文件共享方案。文章通过具体案例详细说明了权限管理的实际应用场景,如使用粘滞位防止文件被误删等,为Linux权限管理提供了实用指导。
2026-03-12 20:14:17
449
原创 Linux入门:常用命令实战笔记
本文精选了Linux系统中最实用的基础命令,适合新手快速上手操作。主要内容包括:文件和目录操作命令(pwd、ls、mkdir、touch、cd、rm等)、文件查看命令(cat、more、less、head、tail)、系统信息命令(uname)、查找命令(which、whereis)、文本处理命令(grep)以及压缩解压命令(zip、tar)。文章通过具体示例讲解命令用法,强调Linux"一切皆文件"的核心概念,并介绍重定向、文件属性等关键知识点。这些命令组合使用可以完成大部分日常Lin
2026-03-12 15:08:58
385
原创 【C++内存安全管理】智能指针的使用和原理
本文分析了C++智能指针的使用场景、设计原理及常见问题。首先阐述了智能指针在异常安全中的重要作用,通过RAII机制实现资源的自动管理。详细介绍了标准库中的auto_ptr、unique_ptr、shared_ptr和weak_ptr的特性及适用场景,重点讲解了shared_ptr的引用计数原理和循环引用问题。最后探讨了内存泄漏的危害及防范措施,建议采用智能指针和RAII思想进行资源管理。全文通过代码示例展示了各种智能指针的典型用法,并提供了weak_ptr解决循环引用的方案,为C++内存管理提供了实用指导。
2026-01-14 20:46:25
654
原创 C++异常处理入门
本文详细介绍了C++异常处理机制,包括异常的概念、抛出与捕获规则、匹配处理代码的查找过程以及异常安全等问题。文章通过具体代码示例演示了异常传播流程,分析了继承体系下的多态捕获方式,并讲解了异常重新抛出、异常规范等高级用法。最后指出标准库提供了exception基类及其派生类体系,建议在主函数中捕获exception基类来处理各类异常。异常处理机制使程序能更好地分离错误检测与处理逻辑,是构建健壮程序的重要工具。
2026-01-14 19:30:52
613
原创 【C++11】(2)从可变参数模板到lambda
本文介绍了C++11中的可变参数模板、类新功能、STL变化、lambda表达式和包装器等特性。可变参数模板支持可变数量和类型的参数,通过参数包扩展实现灵活编程。类新增了默认移动构造/赋值、成员变量缺省值和default/delete控制。STL容器增加了emplace系列接口。lambda表达式简化了匿名函数定义,支持多种捕捉方式。包装器function统一了可调用对象类型,bind可调整参数个数和顺序。这些特性增强了C++的泛型编程能力和代码简洁性。
2026-01-07 19:50:27
574
原创 【C++11】(1)从左值右值到移动语义
本文介绍了C++11中的两项重要特性:列表初始化和右值引用。列表初始化实现了统一的初始化方式,通过std::initializer_list支持容器初始化。右值引用引入了移动语义,通过移动构造和移动赋值减少拷贝开销,提升性能。文章详细解析了左值/右值的区别、引用折叠规则和完美转发实现机制,展示了C++11如何通过右值引用优化资源管理。这些特性显著提升了C++的表达能力和运行效率,是C++11最重要的改进之一。
2026-01-07 17:27:31
731
原创 C++数据结构深度探索:哈希表的实现与优化
本文系统介绍了哈希技术及其衍生数据结构。首先阐述了哈希表的基本概念,包括直接定址法、哈希冲突和负载因子,详细分析了三种哈希函数(除法散列、乘法散列、全域散列)和两种冲突处理方法(开放定址法和链地址法),并提供了完整的C++实现代码。随后讲解了位图的设计原理和应用场景,如海量数据查找和统计。最后介绍了布隆过滤器,说明其通过多哈希函数降低误判率的机制,并给出实现代码。全文深入浅出地讲解了这些高效数据结构的工作原理和实际应用,为处理大规模数据问题提供了实用解决方案。
2025-12-01 19:46:49
999
原创 C++红黑树:理论与实践相结合的平衡艺术
红黑树是一种自平衡二叉搜索树,通过节点颜色约束(红/黑)和旋转操作维持平衡。其核心规则包括:根节点为黑、红色节点不能连续、任意路径黑节点数相同。这些规则确保最长路径不超过最短路径的两倍,保证操作效率为O(logN)。实现时,插入操作需处理三种情况(变色、单旋+变色、双旋+变色)以维持平衡。验证红黑树需检查四点规则是否满足。完整代码实现了插入、查找、旋转等核心功能,并通过递归验证树的平衡性。
2025-12-01 12:29:50
798
原创 C++数据结构:AVL树的插入、旋转与平衡全过程
AVL树是一种自平衡二叉搜索树,其核心特点是保持任意节点的左右子树高度差不超过1。本文详细介绍了AVL树的概念、结构实现和关键操作:插入节点时的平衡因子更新机制,以及四种旋转操作(右单旋、左单旋、左右双旋、右左双旋)的实现原理与具体代码。文章还包含了AVL树的查找功能和平衡检测方法,通过高度差验证树的平衡性。完整代码实现了AVL树的核心功能,包括节点插入、旋转调整和平衡检查。AVL树通过严格的平衡控制,确保操作时间复杂度为O(logN),为后续学习红黑树等高级数据结构奠定基础。
2025-11-09 14:51:46
3072
原创 C++数据结构实战:二叉搜索树的核心操作与应用场景
本文详细介绍了二叉搜索树(BST)的概念、基本操作和典型应用。BST是一种具有特定排序性质的二叉树结构,左子树节点值小于等于根节点,右子树节点值大于等于根节点。文章分析了BST的最优和最差性能情况,并详细讲解了插入、查找和删除操作的实现方法,其中删除操作根据四种不同情况采用不同的处理策略。通过C++代码示例展示了key-only和key-value两种模型的实现,前者适用于存在性检查场景(如车牌识别),后者适用于键值映射场景(如词频统计)。文章指出BST在极端情况下会退化为线性结构,这为后续学习更高效的平衡
2025-11-09 14:32:30
2845
原创 深入理解C++多态:从虚函数到动态绑定
本文详细介绍了C++多态的概念与实现机制。多态分为编译时多态(函数重载/模板)和运行时多态(虚函数),重点阐述了运行时多态的实现条件:基类指针/引用调用虚函数,且派生类完成虚函数重写。文章深入讲解了虚函数表原理、动态绑定机制,并对比了重载/重写/隐藏的区别。此外还介绍了纯虚函数、抽象类、override/final关键字等特性,通过内存布局分析揭示了多态底层实现,最后强调了基类析构函数设为虚函数的重要性以防止内存泄漏。全文系统性地剖析了多态相关概念及技术细节。
2025-10-29 14:47:56
3499
原创 C++继承机制:面向对象编程的基石
本文介绍了C++继承机制的核心概念,包括继承定义(public/protected/private)、基类派生类转换规则、作用域隐藏问题、派生类默认成员函数实现要点。重点分析了菱形继承问题和虚继承解决方案,比较了继承(is-a)与组合(has-a)的差异,指出组合优于继承的设计原则。文章通过大量代码示例详细说明了继承的访问控制变化、成员初始化顺序、静态成员特性等关键知识点,为面向对象编程中的代码复用提供了系统性的指导。
2025-10-29 14:02:36
3620
原创 【C++】深入理解list底层:list的模拟实现
本文介绍了C++中list容器的特性及其模拟实现方法。list是带头双向循环链表,适合频繁插入删除操作但不适合随机访问。文章详细讲解了如何实现list节点、构造函数、迭代器(包括普通和const版本)、插入删除函数等核心功能。重点阐述了迭代器的特殊实现方式,通过运算符重载使其能像指针一样工作。还讨论了拷贝构造、赋值重载等关键问题,并提供了完整代码实现。该模拟实现帮助读者深入理解list底层原理,为STL容器学习打下基础。
2025-10-12 14:06:05
939
4
原创 【C++】vector的使用和模拟实现
本文详细介绍了C++标准模板库中的vector容器。vector是动态数组,具备随机访问、动态扩容和连续存储特性。文章从基本用法入手,包括创建、访问元素、增删操作、容量管理和迭代器使用等,并特别分析了VS环境下的1.5倍扩容机制。重点讲解了二维vector的实现和vector底层模拟,包括构造函数、运算符重载、容量管理、迭代器失效问题等核心内容。通过代码示例展示了vector的深拷贝实现、插入删除操作中的迭代器处理技巧,最后提供了完整的vector.h头文件实现。
2025-10-07 13:48:04
967
2
原创 【C++】string类中的常用成员函数介绍
本文介绍了C++中string类的基本概念和使用方法。string类作为处理字符串的核心工具,相比C语言字符数组具有自动内存管理、丰富成员函数和运算符重载等优势。重点讲解了string对象的构造方法、访问与遍历操作(包括[]操作符、迭代器和范围for循环)、容量操作(size/length/capacity等)以及修改操作(插入/删除/查找/子串等)。通过示例代码展示了string类的常用接口,帮助读者理解如何高效安全地处理字符串。string类大大简化了字符串操作,是C++编程中不可或缺的重要工具。
2025-09-25 15:30:21
1085
1
原创 【C++】类和对象(三)
本文介绍了C++中类的多个重要特性:1. 初始化列表的使用方式及其注意事项,包括成员变量初始化顺序和缺省值设置;2. 类型转换机制,特别是通过构造函数实现的隐式类型转换及其限制;3. static成员的声明、初始化方法及其特性;4. 友元函数和友元类的概念及使用方式;5. 内部类的定义及其与外部类的关系;6. 匿名对象的创建方式及其生命周期特点。这些特性有助于理解C++类的封装、初始化、访问控制等核心机制。
2025-09-06 23:07:30
1078
原创 【C++】类和对象(二)
本文介绍了C++中类的6个默认成员函数,重点讲解了构造函数、析构函数、拷贝构造函数和赋值运算符重载。构造函数用于对象初始化,析构函数用于资源释放,拷贝构造函数实现对象拷贝,赋值运算符重载支持对象赋值操作。编译器会自动生成这些函数的默认版本:对内置类型进行值拷贝,对自定义类型调用其相应函数。当默认行为不能满足需求时(如需要深拷贝时),需要手动实现这些函数。文章通过日期类和栈类的代码示例,详细说明了各成员函数的特性和实现要点,并解释了运算符重载的规则和限制。
2025-09-02 16:38:50
987
原创 【C++】类和对象(一)
本文介绍了C++中类的定义、实例化及this指针等核心概念。主要内容包括:1.类的定义格式及类域作用;2.实例化过程及对象的内存分配规则;3.隐含的this指针工作原理;4.对比展示了C++与C语言实现栈的差异,体现C++封装特性。文章通过类与对象的类比,解释了类作为蓝图、对象作为实例的关系,并详细说明了成员变量存储、函数调用机制等底层原理,帮助读者理解面向对象编程的基础知识。
2025-08-31 16:27:18
1103
原创 【数据结构】二叉树的顺序结构实现
本文系统介绍了树和二叉树的数据结构。主要内容包括:1)树的基本概念与相关术语,如节点度、层次、深度等;2)二叉树的结构特点、特殊类型(满二叉树、完全二叉树)及其性质;3)二叉树的两种存储结构(顺序和链式);4)堆的概念与实现方法,包括堆的向下调整算法及C语言代码实现。文章重点讲解了堆这一基于完全二叉树的特殊数据结构,详细给出了堆的初始化、插入、删除等操作的算法过程和具体实现代码。
2025-08-03 15:07:07
1146
原创 【数据结构】栈和队列的实现
本文介绍了栈和队列两种基本数据结构的概念、特性及C语言实现。栈遵循后进先出原则,通过数组实现,包含初始化、入栈、出栈、获取栈顶等操作。队列遵循先进先出原则,通过链表实现,包含初始化、入队、出队、获取队首/队尾等操作。文章详细展示了两种数据结构的具体代码实现,包括头文件声明、源文件定义和测试用例。栈和队列作为线性表的特例,分别适用于不同场景,理解其实现原理对掌握数据结构基础至关重要。
2025-07-26 22:33:10
716
原创 【数据结构】双向循环链表的实现
本文详细介绍了双向循环链表的实现方法。双向循环链表采用带头节点的结构,每个节点包含前驱和后继指针。文章系统讲解了节点定义、初始化、插入(头插/尾插)、删除(头删/尾删)、查找、指定位置操作等核心功能的C语言实现代码,并提供了完整的头文件、实现文件和测试用例。通过哨兵位设计避免了循环遍历问题,所有操作都严格维护节点的前驱后继关系。代码实现包含动态内存管理、断言检查等健壮性设计,最后给出了链表销毁方法。该实现展现了双向循环链表可双向遍历的特性,为相关数据结构应用提供了实用参考。
2025-07-20 22:30:15
1391
原创 【数据结构】单链表的实现
本文详细介绍了单链表的数据结构及其基本操作实现。首先阐述了链表的概念,指出其物理存储非连续但逻辑上线性有序的特点,通过节点(包含数据域和指针域)连接实现。重点讲解了链表的各种操作:节点创建、打印、头插/尾插、头删/尾删、查找、指定位置插入/删除等,并强调了对指针操作的注意事项。文章提供了完整的C语言实现代码,包括头文件定义和功能测试示例。所有操作均通过二级指针实现,确保能正确修改链表结构。最后说明了链表销毁的重要性,完整演示了单链表的应用实现过程。
2025-07-17 17:19:30
1475
原创 【数据结构】基于顺序表的通讯录实现
本文系统介绍了顺序表的概念与实现,并基于顺序表实现了通讯录功能。主要内容包括:1)顺序表的结构与分类,对比静态顺序表与动态顺序表的优缺点;2)顺序表的基本操作实现,如初始化、增删改查等;3)利用顺序表实现通讯录系统,包含联系人信息的增删改查功能。文章通过详细代码示例展示了顺序表从理论到实践的应用过程,特别强调了动态顺序表在空间管理上的优势。该实现方案可作为数据结构学习的典型案例,有助于理解线性表的存储结构与基本操作原理。
2025-07-14 16:24:23
1186
原创 C语言——预处理详解
本文介绍了C语言预处理的相关知识,包括预定义符号(FILE、__LINE__等)、#define定义常量和宏的注意事项(括号使用、分号问题)、带副作用参数的宏风险、宏与函数的对比(性能vs安全性)、#和##操作符的用法、条件编译指令(#ifdef、#ifndef等)以及头文件包含的两种方式和避免重复包含的技巧(#pragma once)。特别强调宏定义时应考虑运算符优先级和参数副作用,建议宏名全大写以区别于函数。文章还讲解了#undef移除宏定义和嵌套头文件的优化处理方法。
2025-07-10 17:57:26
1429
原创 C语言——编译与链接
C语言代码需要通过编译器转换成二进制指令才能被执行。这个过程分为翻译环境(编译和链接)与运行环境。翻译环境包括预处理(处理宏和头文件)、编译(词法/语法/语义分析)、汇编(转机器指令)和链接(地址重定位)。运行环境则负责程序加载、执行和终止。编译链接过程涉及多个环节,最终生成可执行程序。了解这些步骤有助于更好地理解程序的构建过程。
2025-07-07 23:27:26
1248
原创 C语言—动态内存管理(malloc,calloc,realloc,free,内存泄漏,柔性数组)
本文介绍了C语言动态内存管理的关键内容。主要包括: malloc/free函数的基本用法及注意事项; calloc和realloc函数的功能及区别;6种常见的动态内存使用错误;柔性数组的特性及两种实现方式。重点强调了内存泄漏、越界访问等常见问题的防范措施,为C语言开发者提供了全面的动态内存管理指南。
2025-07-04 20:15:05
1364
原创 C语言---自定义类型:结构体
本文全面介绍了C语言中结构体的核心概念与应用。首先讲解了结构体的声明、初始化和自引用方法,其次详细解析了结构体内存对齐规则,通过实例演示计算过程,并说明对齐原因是为了提升访问效率(空间换时间)。还对比了结构体传参方式,建议优先传递地址以提高性能。最后介绍了位段的概念、内存分配机制及跨平台问题。
2025-07-02 23:27:32
1184
原创 C语言---常见的字符函数和字符串函数介绍
C语言标准库提供了丰富的字符和字符串处理函数。字符分类函数(如islower、isdigit)用于判断字符类型;字符转换函数(如tolower、toupper)实现大小写转换。常见字符串函数包括:strlen(字符串长度)、strcpy(字符串复制)、strcat(字符串拼接)、strcmp(字符串比较)及其安全版本(如strncpy)。此外还有strstr(子串查找)、strtok(字符串分割)和strerror(错误信息)等函数。
2025-06-28 22:18:51
1536
2
原创 C语言---冒泡排序和qsort函数的应用
4 int (*compar)(const void*,const void*)是函数指针,指向的是两个元素的比较函数,比较函数用来比较两个数的函数大小,这个是根据不同类型数组进行排序时,由我们自行编写的。调用 cmp 比较相邻元素。
2025-06-26 23:09:55
1236
原创 C语言---深入理解指针(3)
数组指针变量存放的是数组的地址,能够指向数组的指针变量。//指针数组//数组指针p与*结合,说明p是一个指针变量,然后指向一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。[]的优先级高于*号,所以必须加上()来保证p与*先结合。
2025-06-24 22:12:29
1418
原创 C语言---深入理解指针(2)
这里就利用指针进行数组元素的输入和输出,数组名arr是数组首元素的地址,可以赋值给p,其实数组名arr和p在这里是等价的。这里使用&arr[0]的方式得到数组第一个元素的地址,但其实数组名本来就是地址,而且是数组首个元素的地址。可见函数内部没有正确获取数组元素个数。数组传参的时候,传递的是数组名,数组传参本质上传递的是数组首元素的地址。
2025-06-22 23:16:43
1297
原创 C语言---深入理解指针(1)
在指针类型中有一种特殊的类型是void*类型,是一种没有具体类型的指针,这种指针类型可以接收任意类型变量的地址。一般void*类型的指针是使用在函数参数的部分,用来接收不同数据类型变量的地址,这样的设计可以起到泛型编程的效果,具体我将会在以后博客中的深入理解指针内容的部分来描述。指针的类型决定了对指针解引用的时候能一次操作几个字节,char*的指针解引用只能访问一个字节,而int*的指针解引用能访问4个字节。这里的*是表明pa是指针变量,而前面的int是在说明pa指向的是整型(int)类型的对象。
2025-06-20 23:30:06
1049
原创 C语言---操作符详解
有时我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针:int x;int y;//结果:x = 10 y = 20结构体指针->成员名本文介绍了C语言中所有操作符及其用法,希望对你有用。。
2025-06-19 23:07:39
1259
原创 C语言---扫雷游戏的实现
本文的主题是用C语言写一个扫雷游戏,供读者参考。游戏要求:1. 游戏可以通过菜单实现继续玩或者退出游戏。2. 扫雷的棋盘是9*9的格子。3. 默认随机布置10个雷。4. 可以排查雷,如果位置不是雷,就显示周围有几个雷;如果位置是雷,就游戏结 束。把10个雷之外的所有非雷都找出来,排雷成功,游戏结束。
2025-06-11 21:43:39
1408
原创 C语言---猜数字游戏的实现
本文会讲解如何用C语言写一个猜数字游戏,供读者参考。游戏要求:1. 电脑自动生成一个1~100的随机数2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出猜大了或者猜小了的 反馈,直到猜对,游戏结束。本文写了一个猜数字的游戏,并细致讲解了需要用到的核心函数,希望对你有用。
2025-06-05 22:03:37
1262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅