- 博客(38)
- 收藏
- 关注
原创 【linux】进程概念(1)PCB、系统调用与 proc 目录全解析
平时我们经常会听到进程,但是如果说要具体描述它,我们却又难以组织语言。这个进程到底是个什么东西呢?要了解进程,首先我们要知道,一个进程是从什么时候开始诞生的。程序是静态的,没有被访问时被储存在磁盘中。我们要执行这个程序就要把它从磁盘中拿出来放到CPU中,当操作系统为我们要做的这件事(执行一个磁盘中的程序)分配内存时,一个进程便诞生了。在一个进程诞生时,为了方便管理,每一个进程都会有一个“名字”------进程pid。
2025-12-20 13:09:49
923
13
原创 【linux】从 0 到 1 理解程序启动:冯诺依曼体系、操作系统与系统调用的协同密码
你是否曾好奇,当你点击一个程序的图标,到它在屏幕上显示出结果,这背后究竟发生了什么?今天,我们将从计算机的底层硬件开始,一步步揭开操作系统和进程的神秘面纱。
2025-12-13 22:34:55
1271
4
原创 【linux】基础开发工具(3)gcc/g++,动静态库
动态链接运行时需要链接动态库,速度稍慢,但是无需将代码加载到可执行文件中,所以生成的文件较小,有较高的灵活性,可使用模块化实现,库更新时替换库文件就行,无需重新编译。链接器根据符号的实际地址修改这些引用,填上正确的地址。:可执行文件中包含一个动态段(如.dynamic),其中列出了所依赖的动态库名称,以及一个符号表(如.dynsym),记录了需要从动态库中解析的符号。动态链接,链接器不会将代码复制到可执行文件中,而是记录要用到的动态库中的方法,在运行时调用动态库中的方法,所以称之为运行时链接。
2025-11-05 23:01:54
965
19
原创 【linux】基础开发工具(2)vim
vim是linux中的一款命令行编辑器,功能强大,几乎所有的linux发行版都会预装。类似于c++和c语言,vim是vi的升级版,兼容vi的所有命令,同时拥有自己的新特性。
2025-10-29 23:12:46
1279
29
原创 【linux】基础开发工具(1)
开发者会把具体的项目的码源传到linux社区中或者github上,我们可以直接下载源代码,然后编译,最后手动解决软件的依赖问题,软件就可以使用了。RPM(RPM Package Manager,原名 Red Hat Package Manager)是 Linux 系统上的一种软件打包格式,文件扩展名为.rpm。我们可以通过rpm包安装软件但是软件要运行光有一个软件是不行的,还需要解决相关的依赖问题 ,要把软件依赖的文件分别安装到需要的目录中,才能正常的运行软件。
2025-07-01 22:59:22
1255
32
原创 【linux】权限深入解析
权限=角色+属性。一切权限都是关于角色和权限类型的,核心角色一共分为三类——所有者(User):文件的创造者,所属组(Group):一组用户共享相同的权限,其他用户(Other):除上述两者的其他用户。权限类型,读(r),写(w),执行(x)。ls -l命令用于查看文件和目录的详细信息。权限位三位为一组,第一位都只能是r或-,第二位是w或-,第三位是x或-,分别意味着,拥有者,所属组,其他的权限。权限都是确定的,只能有或没有。
2025-06-29 23:06:02
2124
29
原创 【Linux】基础指令(2)
H : ⼩时(00..23)%M : 分钟(00..59)%S : 秒(00..61)%X : 相当于 %H:%M:%S%m : ⽉份 (01..12)%Y : 完整年份 (0000..9999)%F : 相当于 %Y-%m-%d。
2025-05-02 15:36:26
1867
30
原创 【c++】AVL树模拟实现
AVL树是最先被发明出来的自平衡二叉查找树,在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子,每一个节点都有一个平衡因子(一般是右子树高度 - 左子树高度);AVL树要求左右子树高度相差不能超过1,即平衡因子只能是0,1或-1。AVL树的高度始终是log(n),n为节点数量。
2025-04-27 23:05:28
817
19
原创 map和set的使用
set的模板参数template <class T,//键值类型class Compare = std::less<T>,/仿函数用来控制顺序class set;1.T就是键值的类型。2.在默认情况下,set支持的是小于比较,可以自己写仿函数。3.set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。4.一般后面两个参数我们是用不到的。5.set的底层是红黑树,增删查的效率是O(logN)(键值不能修改)。
2025-04-21 21:16:51
1086
25
原创 【数据结构】二叉搜索树
当我们用有序数组储存数据时,查找某个数据可以用折半查找,时间复杂度为LogN;但是当我们要插入或删除数据时需要一步一步挪动数据,消耗非常大。为此引入了二叉搜索树这个数据结构。
2025-04-19 23:33:52
1235
20
原创 【双指针】移动零
观察输入输出:输出中一共分为两个区域,0区和非零区。但是在处理未完成之前,必然存在着一个零和非零数共存的区域,所以在处理的过程当中一共有三个区域,0区,非0区和未处理区。要将整段数据划分成三个区域,那么我们需要几个标志位呢。取两个标志位就可以将代码分成三部分。我们可以取标志位A和B,A之前的为非零区,AB之间是未处理区,B之后是零区。设A为dest,设B为cur。进入操作之前,初始状态A左边为非零区,右边为零区,所以初始化A为-1。
2025-03-16 23:20:07
346
3
原创 【c++】继承
我们看到的Artiodactyla称为基类,也叫父类。Pig和Hippopotamus称为派生类,也称子类。继承方式分为三种:public,private,protected。这和三个访问限定符一样,但是功能却不相同。在访问限定符中, private和protected几乎没有差别,都不能由类外直接访问。而在继承方式这里,private与protected就有所区别了。
2025-03-16 15:37:11
1245
23
原创 【c++】vector的使用
前面我们学习了c++管理字符串的string类,较c语言管理字符串方便了不少。但是在处理其他数据(非字符串)时显得力不从心。这时,c++为我们提供了一个强大的容器——vector。vector底层是一个动态开辟的数组,它为我们提供了许多的接口来管理数据。
2025-01-24 16:13:11
1993
30
原创 【c++】string类 (二) 模拟实现
string依然是一个线性的结构,所以说在实现的时候和以前实现的线性结构差不了多少,总体还是我们的老三样——_str,_size和_capacity。本次实现string的时候,我们把一些简单的小函数在.h中直接定义,所以我们要注意链接错误,.h文件中的函数,如果定义在类里面,默认是内敛的,不会放到符号表,不用担心链接错误,但是如果是在类外面定义的函数,.h文件在test.cpp和string.cpp中都包含了一份,就会有两个这个函数,导致链接错误。
2024-12-08 00:15:04
611
27
原创 【数据结构】二叉树(一)遍历
前面以及有了堆的基础,现在来学习二叉树。二叉树的学习和前面的数据结构很不一样,前面我们主要学习用数据结构储存数据,以及实际手搓数据结构的增删查改;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构做准备,我们主要学习遍历二叉树,学一下二叉树的结构。
2024-10-15 22:55:13
1109
40
原创 【c++】string类 (一)
'\0''\0''\0'c风格类型的字符串我们都已经很熟悉,\0的存在让我们在处理在处理字符串的时候需要时刻小心,在手动拼接或复制字符串时经常会因为\0处理不妥而出错。c++为我们提供了一个全新的string来处理字符串的长度、内存分配和释放,因此开发者可以专注于字符串的内容,而不必担心细节。在一切开始之前,我们先介绍一个网站。是一个广受欢迎的C++编程语言资源网站,成立于2000年代初期。开始由一个c++爱好者建立,后来各路大佬汇聚,网站内容也非常成熟,可供我们学习和参考。
2024-10-06 23:28:54
1454
38
原创 【Linux】基础指令 1
LInux中各个指令是相互联系的,所以一开始学习Linux时,对指令很陌生是正常的,不用花费大量的时间去刻意的记忆,在我们一次次的使用当中,这些指令自然会烂熟于心。
2024-10-03 23:12:02
1316
22
原创 【c++】 模板初阶
写一个交换函数,在学习模板之前,为了匹配不同的参数类型,我们可以利用函数重载来实现。虽然这样似乎解决了问题,但是这样的设计写着太过麻烦,只要出现新类型就需要写新的函数,代码的复用率很低。有没有什么可以让我们一劳永逸呢?模板就可以实现这一功能。这种通过抽象和模板化来编写可重用和灵活的代码以此提升代码的可读性和维护性,同时避免代码重复的方式称为泛型编程。
2024-10-02 22:29:31
795
21
原创 【c++】类和对象(下)
const类型成员必须在定义的时候就初始化,定义了之后不能改变注意这是错误演示 ,const 类型成员要在初始化列表中初始化。//注意这是错误演示class Datepublic:,_month(5),_day(10)_n = 1;//const类型成员必须在定义的时候就初始化,定义了之后不能改变private:int _year;int _month;int _day;Date d1(i);d1.Print();
2024-09-05 20:30:07
817
34
原创 【c++】类和对象 (中) (类的默认成员函数)
在C++中,如果你定义了一个类但没有显式地提供特定的成员函数(比如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等),编译器会为这些函数生成默认的实现。这些默认生成的成员函数称为类的默认成员函数。那么既然编译器会默认生成,那么我们学习什么呢?第一:我们要能判断默认生成的函数能否则满足我们的需求第二:如果默认生成的函数不能满足我们的需求,那么我们该如何实现这些函数实际上是八个,后面的后续补充。接下来我们依次来学习这些函数。
2024-08-12 21:39:33
1272
38
原创 【c++】类和对象(上)
class为定义类的关键字,Date为类的名字,{}内的是类的内容简称为成员:类中的变量称为成员变量(属性),类中的函数称为成员函数(方法)。类末尾的分号不能省略。定义在类里面的成员函数默认为inline。C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。
2024-08-06 17:12:19
916
12
原创 【数据结构】 -- 堆 (堆排序)(TOP-K问题)
要学习堆,首先要先简单的了解一下二叉树,二叉树是一种常见的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的应用非常广泛,在后面我会详细介绍。满二叉树:除了叶子结点外,每个结点都有两个子结点一个深度为k的满二叉树有2的k次方减一个节点。完全二叉树:除了最底层可能不是满的外,其它每一层从左到右都是满的。满二叉树是完全二叉树的子集,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。堆就是一种完全二叉树。
2024-06-09 22:30:22
2008
14
原创 【数据结构】 -- 队列
队列是一种线性表,队列遵循先进先出的特性。先放入队列的数据,一定先出队列。倘若数据以ABCD的顺序入队,出队的顺序一定也是ABCD。
2024-05-30 21:55:32
545
12
原创 【数据结构】-- 栈
引入:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈压栈入栈,。出栈:栈的删除操作叫做出栈。。注意:入栈顺序是DCBA,出栈顺序不一定是ABCD,可以边入边出所以,入栈顺序是DCBA ,出栈顺序有很多种。栈的实现:数组,单向链表,双向链表都能够实现栈:数组:单链表:用单链表实现栈有一个问题,单链表不能回头,如图这么设计,在压栈之后,不方便出栈。所以我们可以以开头作为栈顶,然后对链表头插来实现栈,出栈的时候使用头删。
2024-05-28 23:35:08
1352
9
原创 【数据结构】-- 相交链表-环形链表
如果链表的两条链的长度一样,链表两端对齐,解决这个问题将会变得非常简单,直接分别遍历两个链表,想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表,分别求出以a开始和以b开始时的链表长度,求出a,b之差的绝对值k。然后再让较长一端先走k步,这样就对齐了。然后再同时遍历链表,两端相等时,这个节点即为所求。其实,这就是一个快慢指针的解法,快慢指针每次都只走一步,只不过快指针先走使链表对齐。
2024-05-13 23:29:38
1103
13
原创 【算法】-- 二分查找详注
二分查找,也称为折半查找;首先,二分查找是一种基于有序数组中查找特定元素的算法,所以它会因为数组的一些特性而受限。它的工作原理是不断将要查找的区间分成两部分,然后确定目标值可能存在的区间,直到找到目标值或者确定目标值不存在为止。这个算法的时间复杂度为O(log n),其中n是数组的大小。二分查找通常比线性查找(暴力查找)快,尤其是在大型数组中查找元素时。
2024-05-08 17:23:55
889
14
原创 【数据结构】-- 单链表的实现
仔细观察,凡是不需要遍历链表的操作,我们就不许要传二级指针做形参。例如删除指定位置之后的数据和在指定位置后插入数据就不需要传二级指针。在对某一个节点进行操作时,要考虑两个方面,一要对指定的节点进行操作,二要调整相邻节点的指针,使得链表的结构得以维护。t=N7T8。
2024-04-21 16:46:39
2166
20
原创 基于数组的数据结构--顺序表
一个学校里,学生可能有成千上万,非常不方便管理,要找一个学生非常难。把学生基于年级班级分成一个个的班级,这样就可以很轻松的找到某一个学生。在计算机中,有着各种数据需要处理,因此引入了数据结构。数据:什么是数据呢?日常生活中的图片,听的音乐,储存的联系人,这些都是数据。结构:帮数据结构就是处理数据的方式,例如给知识做思维导图,把知识联系到一起。在计算机中我们要处理很多不同的数据,单个的数据不方便管理。因此引入了数据结构。数据结构是一种特定的数据组织方式,它定义了数据之间的关系、操作和存储方式。
2024-04-10 17:13:32
747
9
原创 动态内存管理
realloc函数的目的是修改已分配内存块的大小,如果新的大小比原来的大,那么系统会尽可能地将原来的数据复制到新的更大的内存块中,并且释放原来的内存块。如果新的大小比原来的小,那么原来的内存块可能会被移动到一个较小的内存块中,但是原来位置的内容仍然会被保留在新的内存块中。malloc就是C语言为我们提供的开辟内存空间的函数,这个函数向内存申请⼀块连续可用的空间,并返回指向这块空间的指针。原来的内存后有足够的空间用来开辟,新开辟的内存接在原来的内存之后,原来的内存不会改变。malloc(开辟空间)
2024-03-31 21:33:12
467
3
原创 深入理解指针(2)
在使用函数的时候,我们会传入需要的参数,函数会创建形参来接受,有两种情况:一种是将地址指向的值传入到函数当中,另一种是直接传入地址。传值调用传值调用,创建的形参x,y使用了新的地址,接受了a,b的值,但是x,y相对a,b已经独立了,对x,y的操作已经不能影响到a,b了。所以交换前后,ab的值不变。传址调用传址调用直接用形参接收地址,通过对地址的操作而可以直接影响ab,从而实现交换。
2024-03-24 10:37:07
1116
4
原创 深入理解指针(1)
内存和地址大家都知道,计算机将信息储存在内存中,那么计算机是如何从内存中读取数据的呢?就像我们上课找教室一样,我们根据教室的门牌号来找到正确的教室才能上课。那么计算机中有没有一个门牌号呢?计算机中,内存被分成一个一个的内存单元,每个内存单元的大小取一个字节,每一个内存单元都被编了号,这个编号就是地址(指针),所以 内存的编号 == 地址 == 指针。计算机中的编址,并不是把每个字节的地址记录下来,通过硬件完成。CPU和内存之间的数据传输是通过三组总线连接的,分别是地址总线、数据总线和控制总线。
2024-03-18 21:03:06
1033
4
原创 分支循环语句(C语言)
C语言是结构化的程序设计语言,一般分为顺序结构,选择结构和循环结构if语句就属于选择结构,根据条件的成立与否选择语句是否执行if语句的基本语法if(表达式)语句若表达式成立会返回一个非零的值表示真则代码执行,反之返回一个0表示假,语句不执行。基本语法(表达式)语句语句若If中的表达式返回值为0(为假)则执行else的语句if和else都可以嵌套if else结构。
2024-01-28 11:06:18
458
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅