自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

2403_87165176的博客

记录大学计算机成长历程

  • 博客(53)
  • 收藏
  • 关注

原创 【Linux】深入理解软硬链接

本文介绍了Linux系统中的软链接和硬链接。软链接通过ln -s命令创建,相当于快捷方式,具有独立inode,删除源文件会导致链接失效。硬链接通过ln命令创建,与源文件共享inode,删除文件仅减少引用计数。软链接常用于简化命令路径(如将可执行文件链接到系统路径),硬链接则用于路径定位和目录切换。目录文件默认包含.和..两个硬链接,分别指向当前和上级目录,但禁止手动创建目录硬链接以避免路径死循环问题。两种链接机制各具特点,适用于不同场景。

2025-12-28 16:41:17 1268 5

原创 【Linux】必看!!!深入理解文件系统(二)

本文介绍了Linux文件系统的基本原理和磁盘存储机制。文件由内容(数据块)和属性(inode)组成,分别存储在磁盘不同位置。磁盘通过CHS和LBA两种寻址方式定位扇区,文件系统采用ext2结构管理分区。重点阐述了inode的作用(存储文件属性)和文件存储的多级索引结构(直接、一级、二级、三级索引)。目录文件保存文件名与inode的映射关系。文章还解释了进程访问文件的流程、内存管理机制(页框/页帧)以及页缓存技术(通过基数树快速定位文件缓存页)。最后说明了文件删除只需修改bitmap而非实际擦除数据的特点。

2025-12-20 21:50:44 1484 2

原创 【Linux】零基础深入学习linux文件系统(一)

本文介绍了C语言文件操作函数和系统接口的基本使用。主要内容包括: C语言文件读写函数(fopen/fwrite/fread)的使用示例 系统接口open/read/write/lseek的实现原理和使用方法 文件描述符的分配规则和本质(PCB中的数组下标) 重定向的实现原理(通过关闭标准文件描述符) 缓冲区的三种刷新模式及其对fork()行为的影响 关键点:C语言I/O函数封装了系统调用,文件描述符本质是数组索引,重定向通过修改文件描述符实现,缓冲区行为影响输出结果。

2025-11-30 22:43:30 2254 12

原创 【Linux】深入理解进程(五)(进程终止,进程等待,进程替换,实现shell)

本文探讨了进程终止与等待的相关机制。首先解释了main函数返回值的作用,0表示成功,非0值表示错误,返回值由父进程接收。介绍了Linux中查看退出码的$?指令,并通过代码示例演示了不同错误情况下的退出码。 详细分析了进程退出的三种场景:正常结束(正确/错误)和异常终止。重点讲解了进程等待的必要性,包括wait和waitpid两种方法:wait会阻塞父进程,waitpid支持非阻塞操作。文章通过代码展示了如何使用这些系统调用来回收子进程资源并获取退出状态。 还介绍了exit和_exit函数的区别,前者会刷新缓

2025-11-25 17:03:30 735 24

原创 【Linux】深入理解进程(四)(进程地址空间)

本文探讨了进程地址空间与虚拟地址的概念。通过代码示例展示了静态变量和全局变量存储在同一区域,并发现父子进程相同虚拟地址对应不同物理地址的现象,说明虚拟地址不是物理地址。文章解释了虚拟地址空间由内核数据结构mm_struct和页表管理,每个进程拥有独立的地址空间。进程独立性通过内核数据结构创建和代码加载实现,页表权限设置能保护只读区域并支持惰性加载。虚拟地址的作用包括统一内存视角、物理内存访问保护以及解耦进程和内存管理。

2025-11-16 21:30:38 1131 9

原创 【Linux】深入理解进程(三)(环境变量)

本文介绍了环境变量的概念及其在操作系统中的应用。环境变量是操作系统运行环境的参数,具有全局属性,可被子进程继承。PATH变量决定了指令搜索路径,解释了为何某些程序可直接运行而自定义程序需要路径前缀。文章还探讨了HOME、USER等常见环境变量,并介绍相关操作命令如echo、export、env等。通过代码示例展示了如何通过main函数参数和环境变量表获取环境变量,以及使用getenv系统调用。最后区分了内建命令和常规命令,说明内建命令(如cd)必须直接影响父进程而非创建子进程的原因。

2025-11-02 21:07:35 1741 11

原创 【Linux】深入理解进程(二)(fork,进程状态)

本文介绍了进程管理的核心概念:1)fork系统调用会创建子进程,父子进程共享代码但数据写时拷贝,通过返回值区分执行流;2)进程状态包括运行(R)、睡眠(S)、磁盘休眠(D)、停止(T)和死亡(X),重点分析了僵尸进程(Z状态)和孤儿进程的危害及产生原因;3)进程优先级PRI和nice值调整机制,解释了进程的竞争性、独立性及并发的实现原理;4)通过CPU寄存器上下文切换机制,阐述了进程并发执行时如何保存和恢复现场。这些概念是理解操作系统进程管理的基础。

2025-10-23 08:37:23 1318 26

原创 【Linux】深入理解进程(一)(冯诺依曼,操作系统,PCB)

本文摘要: 冯诺依曼结构是现代计算机的基础架构,由存储器(内存)、输入输出设备和CPU(运算器+控制器)组成。内存作为硬件级缓存处于核心地位,协调不同设备间的速度差异。操作系统是管理软硬件资源的软件,通过系统调用接口保障数据安全。进程是正在运行的程序,由PCB(Linux中为task_struct)描述其属性,并与代码数据共同构成。文章还介绍了查看进程的方法(/proc目录和ps命令)及系统调用获取进程ID的方式(getpid/getppid),并解释了缓存机制对程序输出的影响。

2025-10-20 11:17:54 1757 29

原创 【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)

本文将介绍Linux系统下的常用开发工具,包括软件包管理器yum、编译器vim/gcc/g++、构建工具Makefile以及调试器gdb的使用方法。主要内容涵盖: yum软件包管理器的工作原理和使用,包括安装(gcc/lrzsz/sl/cowsay)和卸载软件包的操作命令; vim编辑器的三种模式切换和常用命令操作,如光标移动、复制粘贴等; gcc/g++编译器的四步编译过程(预处理、编译、汇编、链接)及静态/动态库的区别; Makefile自动化构建工具的基本语法和原理,包括依赖关系和伪目标的使用; gd

2025-10-16 00:46:55 2119 36

原创 【Linux】零基础学会Linux之权限

Linux文件权限系统详解:文件类型分为目录(d)、普通文件(-)等,访问者分为所有者(u)、所属组(g)和其他人(o)。基本权限包括读(r)、写(w)和执行(x),分别对应不同操作权限。权限值可用3位八进制表示(如664)。修改权限使用chmod命令,更改所有者/组使用chown/chgrp。目录权限需特别注意:无x权限无法进入,无r权限无法查看内容。通过设置粘滞位(+t)可防止非文件所有者删除他人文件,保障目录安全。

2025-10-09 03:20:58 2253 40

原创 一文学会《C++》进阶系列之C++11

C++11引入了统一列表初始化,通过花括号{}语法可以初始化数组、结构体、内置类型和自定义类型对象,并支持在new操作符中使用。新增的std::initializer_list类型使容器初始化更加简便,允许使用列表语法构造和赋值容器。右值引用弥补了左值引用无法高效处理临时对象的缺陷,通过移动构造和移动赋值避免了深拷贝开销。右值引用只能绑定右值或move后的左值,而const左值引用可以同时绑定左值和右值。这些特性显著提升了C++在资源管理和性能优化方面的能力。

2025-10-05 15:53:24 1802 27

原创 一文学会《C++》进阶系列之哈希(包括位图布隆过滤器)

文章摘要:C++11引入了unordered系列关联容器(unordered_map、unordered_set等),其底层采用哈希结构实现,查询效率可达O(1)。与红黑树实现的map/set相比,unordered系列容器通过哈希值直接定位元素,但遍历效率较低。文章重点介绍了unordered_map的特性(键值唯一、无序存储、哈希桶机制)和常用接口(构造、容量查询、元素访问[]操作符等),并对比了哈希结构与顺序结构/平衡树的性能差异,指出哈希结构通过减少关键码比较次数实现高效查询。(149字)

2025-09-21 23:55:00 1744 16

原创 一文学会《C++》进阶 二叉搜索树,AVL树,红黑树

二叉搜索树与AVL树摘要 二叉搜索树(BST)是一种有序二叉树,满足左子树小于根节点、右子树大于根节点的特性。其基本操作包括查找(O(h)复杂度)、插入和删除(需处理四种情况)。BST在数据有序时会退化成链表,效率降低。 AVL树是自平衡二叉搜索树,通过平衡因子(左右子树高度差≤1)保持平衡。插入节点后需调整平衡因子,不平衡时通过四种旋转操作恢复平衡:左单旋(右右失衡)、右单旋(左左失衡)、左右双旋(左右失衡)和右左双旋(右左失衡)。AVL树保证了O(log n)的查询效率,适合动态数据管理。

2025-09-09 23:59:56 1872 18

原创 这一文让你学会《C++》进阶之 set与map应用

本文介绍了C++中的关联式容器,主要包括set、map、multiset和multimap。与序列式容器不同,关联式容器存储的是<key,value>键值对,检索效率更高。文章详细讲解了键值对pair的结构定义,并重点介绍了set和map的特性与使用方法:set存储唯一值且不可修改,map支持下标访问;multiset和multimap则允许键值重复。最后通过两个编程例题(前K个高频单词和单词识别问题)展示了关联式容器的实际应用,包括自定义排序规则等技巧。

2025-09-01 00:57:13 2219 19

原创 一文理解并学会《C++》三大特性之多态

文章摘要:本文详细讲解了C++多态的概念、实现和应用。首先通过公交卡示例形象说明多态现象,指出多态是通过基类指针/引用调用虚函数时产生的不同行为。重点分析了虚函数重写规则、override/final关键字、虚函数表机制等核心原理,比较了重载/重写/重定义的区别,并介绍了抽象类和纯虚函数。通过内存布局图解阐释了虚函数表指针和多态调用机制,区分了静态绑定和动态绑定的本质差异。最后简要说明了多继承场景下的虚函数表处理方式。全文系统性地解析了C++多态的实现原理和技术细节。

2025-08-12 02:23:34 11742 11

原创 这一文学会《C++》三大特性之继承 (内含组合)

【摘要】本文系统介绍了C++面向对象程序设计中的继承机制。继承实现了代码复用,允许派生类在基类基础上扩展功能,形成类的层级结构。文章详细讲解了继承的定义方式、访问权限控制、派生类与基类的赋值转换规则(切片操作)、作用域与成员隐藏、派生类默认成员函数调用顺序等核心概念。特别分析了菱形继承带来的数据冗余和二义性问题,并提供了多继承、静态成员继承等特殊情形的处理方式。通过大量代码示例,直观展示了继承机制的各项特性及其应用场景。

2025-08-07 20:54:56 1251 4

原创 一文学会c++栈 队列 堆 容器适配器 反向迭代器 优先级队列stack queue priority_queue

本文介绍了C++中三种重要的容器适配器:栈(stack)、队列(queue)和优先队列(priority_queue)。 栈(stack):先进后出结构,底层默认使用deque实现,提供push()、pop()、top()等操作,并给出栈的压入弹出序列和逆波兰表达式两道例题。 队列(queue):先进先出结构,同样基于deque实现,包含push()、pop()、front()等基本操作。 优先队列(priority_queue):类似堆结构,默认大顶堆基于vector实现,可通过greater<in

2025-07-31 08:45:00 1219 3

原创 一文学会《C++》STL之list容器

本文介绍了C++中list容器的特性与模拟实现。list是一种双向链表结构,支持常数时间任意位置插入但访问元素需要线性时间。文章讲解了list的基本接口、迭代器失效问题及正确使用方法,并详细展示了list的模拟实现过程,包括节点类、迭代器类和list类的设计,重点实现了插入、删除等核心操作。模拟实现部分采用模板编程,支持迭代器操作符重载,能够像标准库list一样使用迭代器访问和修改元素。

2025-07-26 14:11:09 1056 9

原创 这一文学会《C++》STL之vector容器!

vector简介与使用要点 vector是C++中的动态数组,具有自动扩容特性。主要特点包括:动态大小、随机访问、尾部插入高效(O(1)时间)。使用时需注意迭代器失效问题,特别是扩容和删除操作后。常用接口包括:push_back/pop_back、resize/reserve、begin/end等。vector会预分配额外空间(通常1.5-2倍),减少频繁扩容开销。关键注意事项:扩容可能导致原有迭代器失效,erase操作后需要重新获取迭代器。模拟实现展示了vector的核心机制,包括迭代器、容量管理和元素操

2025-07-17 21:55:26 1061 7

原创 这一文让你学会《C++》STL之 string容器

本文介绍了C++标准库中string类的常用接口及其模拟实现。主要内容包括:1)string对象的构造方法;2)容量操作接口如size、capacity、resize等;3)访问及遍历方法如operator[]、迭代器等;4)修改操作如append、push_back等;5)非成员函数如运算符重载。还展示了string类的模拟实现,采用字符指针、长度和容量三个成员变量,实现了构造函数、拷贝控制、容量调整、元素访问、字符串操作等核心功能。代码示例详细演示了如何通过new/delete管理内存,以及通过strc

2025-07-14 00:17:51 1299 5

原创 一文认识并学会c++模板(初阶)

泛型编程是通过编写与类型无关的通用代码实现代码复用的手段,模板是其基础。函数模板允许定义通用函数,编译器会根据实参类型自动生成具体代码,支持隐式和显式实例化。类模板类似,但实例化时需显式指定类型。泛型编程通过模板机制避免了重复编写不同类型的功能代码,提高了开发效率。

2025-07-13 21:57:57 1317 5

原创 超级详细讲解转义字符,\? \‘ \f \0 \t等等!!!

d代表一个8进制数(0~7),\130,会将8进制数130转义十进制数88,根据ASCLL表(一个将键盘上的所有字符用数字表示的表),88表示X。用于字符串的停止,\0 是一个转义序列,代表空字符(null character),它的ASCII码是0,\0 和 \000 是等价的,都表示ASCII码为0的字符。每个红框8个字符,\t使光标跳跃,可以使打印的更整齐。\b使得光标回退一格,再输入abc会替代g的位置。,光标有的在下一行的同一列,有的在下一行的开头。想打印\n,\转义后面的,使变为普通的\。

2025-05-30 21:32:13 5319 1

原创 一文学会c++中的内存管理知识点

C/C++内存管理主要分为栈、堆、数据段和代码段四部分。栈存储非局部变量和函数参数,堆用于动态内存分配,数据段存放全局和静态变量,代码段保存可执行指令和常量。C语言通过malloc/calloc/realloc分配内存,free释放;C++则新增new/delete操作符,简化了动态内存操作。相比malloc/free,new/delete能自动调用构造函数/析构函数,支持初始化,且无需强制类型转换。关键区别在于new/delete是操作符而非函数,具有更完善的异常处理机制,尤其对自定义类型处理更高效。合理

2025-05-30 02:27:30 1674 6

原创 全面理解类和对象(下)

文章摘要:本文探讨了C++构造函数的初始化列表与赋值区别,指出初始化列表才是真正的初始化操作。介绍了静态成员的特点与使用场景,包括静态变量必须在类外初始化、静态函数无this指针等特性。详细讲解了友元机制(友元函数和友元类)如何突破封装限制,以及内部类的定义和使用特点。最后强调类作为实体描述模板的作用,通过实例化创建具体对象。全文通过代码示例详细说明了各类语法特性的使用方法和注意事项。

2025-05-25 16:19:41 1146

原创 超详细讲解C语言转义字符\a \b \r \t \? \n等等

C语言有一组字符很特殊,叫做,顾名思义,

2025-05-23 14:10:28 834

原创 全面学习c++类与对象(中)(非常重要)(析构构造拷贝函数赋值运算符重载等等)

在C++中,类的默认成员函数包括构造函数、析构函数和拷贝构造函数。即使类为空,编译器也会自动生成这些默认成员函数。构造函数用于初始化对象,其名称与类名相同,无返回值,且可以重载。如果类中没有显式定义构造函数,编译器会生成一个默认的无参构造函数,但不会初始化内置类型。C++11允许在声明时为内置类型提供默认值。析构函数用于清理对象资源,其名称为类名前加~,无返回值且不能重载。对象生命周期结束时,编译器会自动调用析构函数。拷贝构造函数用于创建一个与现有对象完全相同的新对象,其参数必须为类类型的引用,否则会导致无

2025-05-22 21:55:09 1897 1

原创 全面且深度学习c++类和对象(上)

C语言是面向过程的设计,关注的是步骤和流程,而C++是面向对象的设计,关注的是对象及其交互。例如,洗衣服的过程在C语言中需要详细描述每个步骤,而在C++中则通过人、衣服、洗衣粉和洗衣机四个对象的交互完成,用户无需关注洗衣机的具体工作原理。C++引入了类的概念,类中可以定义变量和函数,而C语言的结构体只能定义变量。C++通过访问限定符(public、protected、private)实现封装,隐藏对象的内部细节,仅对外公开接口。类的实例化是创建类的对象并分配实际内存空间的过程。类的大小计算不包含函数,仅计算

2025-05-16 23:08:47 923

原创 数据结构0基础学习堆

堆是一种重要的数据结构,是一种完全二叉树,(二叉树的内容后面会出),堆分为大小堆,大堆,左右结点都小于根节点,(又称子节点和父节点),小堆则反过来,可以用静态数组/顺序表实现。

2025-05-09 13:42:07 1688 2

原创 【基础必备】C语言转C++入门篇(各种杂碎知识)

本篇文章学习c++知识,主要是补充C语言的不足之处,同时也为后续C++学习铺路。引用是给一个变量取一个别名,两者共用一块内存,两者关系就像西红柿和番茄的关系 ,引用的存在主要来替代指针作用,符号是&,和取地址符相同。int& b = a;return 0;

2025-05-07 22:23:27 1442

原创 一篇文章搞懂数据结构算法的时间复杂度和空间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,

2025-05-06 23:14:11 1192 1

原创 C语言数据结构之顺序表

的存储单元依次存储数据元素的线性结构,一般情况下采用数组存。静态顺序表缺点:开多了用不了,开少了又不够。生死有命富贵在天,能不能悟就看自己了。在数组上完成数据的增删查改。动态:使用动态开辟的数组存储。静态:使用定长数组存储元素。

2025-05-05 23:57:37 1384

原创 【万字超精品】一篇文章搞清楚全部排序(冒泡排序插入排序希尔排序选择排序堆排序快速排序(递归非递归)归并排序(递归非递归)计数排序)

排序是计算机领域最基础且重要的算法,将一组数据按降序或升序重新排列,如网购网站价格排序等等。广泛用于==数据库查询,数据分析,搜索算法,==等等。

2025-05-03 22:32:05 1965

原创 一篇文章搞懂数据结构算法的时间复杂度和空间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,

2025-04-26 22:10:32 1865

原创 C语言学习之二叉树(有例题)

二叉树是一种重要的数据结构,每个节点最多有两个字节点,分为左右节点,

2025-04-24 22:14:38 1282

原创 冲刺蓝桥杯之速通vector!!!!!

为了应对这种情况,nums1的初始长度为m+n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。输入:nums1=[1,2,3,0,0,0],m=3,nums2=[2,5,6],n=3。合并结果是[1,2,2,3,5,6],其中斜体加粗标注的为nums1中的元素。:有柜子,柜子还带有格子,说明是二维的。

2025-01-30 23:48:09 3345 1

原创 一篇文章搞清楚动态内存管理所有知识,包括柔性数组

当是情况2的时候,原有空间之后没有⾜够多的空间时,扩展的⽅法是:在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。因为free(str);所以如果我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任务。当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发⽣变化。//传过去是要释放的空间的起始地址。//在栈空间上开辟10个字节的连续空间。,那数组的编译时开辟空间的⽅式就不能满⾜了。但是对于空间的需求,不仅仅是上述的情况。

2025-01-28 15:41:22 1967

原创 一篇文章彻底捋顺C语言文件操作知识点

磁盘/硬盘上的文件叫文件,按功能分两种,程序文件和数据文件int main()return 1;fclose(pf);pf=NULL;return 0;int ch;ch

2024-12-09 22:40:53 2804

原创 深入学习指针(5)!!!!!!!!!!!!!!!

时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数。strcpm比较俩字符串大小,对应位置字符的ASCLL值。件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。

2024-12-01 21:44:57 1587

原创 史上最全指针解析!!!!!!深入学习指针!!!!(4)

数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的==&数组名==如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针。过去我们有⼀个⼆维数组的需要传参给⼀个函数的时候,⽐如有⼀个整型的⼆维数组,写⼀个函数。函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。test,打印数组的全部内容。

2024-12-01 21:44:53 1100

原创 深入学习指针!!!史上最全指针解析!!!!!(2)

传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;我们现在要解决的就是当调⽤Swap函数的时候,Swap函数内部操作的就是main函数中的a和b,直接。变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的地址的改变也可以修改这个变量。不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让。NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址。这就是const的作⽤。

2024-11-28 20:14:59 1734

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除