- 博客(55)
- 收藏
- 关注
原创 Linux中《基础IO》详细介绍
FILE:是C语言标准库中定义的一个结构体类型(struct),用来表示一个“文件流”,结构体里面封装了文件描述符fd,在操作系统的接口中,只认文件操作符fd。缓冲区是内存空间的⼀部分。也就是说,在内存空间中预留了⼀定的存储空间,这些存储空间⽤来缓冲输⼊或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设备,分为输⼊缓冲区和输出缓冲区。缓冲区就是一段内存空间。
2025-06-09 20:35:34
950
原创 Linux中《进程控制》详细介绍
本文介绍了Linux进程管理的核心概念和方法,主要包括三个部分:进程创建、进程终止和进程等待。 在进程创建部分,详细讲解了fork函数的工作原理,包括其返回值机制和写时拷贝技术,解释了如何通过fork创建父子进程以及资源分配过程。 进程终止部分阐述了进程退出的三种场景(正常正确、正常错误和异常终止),对比了exit()和_exit()函数的区别,并介绍了退出码的含义及其获取方法。 进程等待部分说明了父进程等待子进程的必要性,重点介绍了wait和waitpid两种系统调用,包括参数设置、返回值解析以及如何获取
2025-06-08 21:05:42
573
原创 MySQL数据库基础
本文介绍了数据库的基本概念和使用方法。首先分析了传统文件存储的缺点(安全性低、查询管理困难等),说明数据库作为专业数据管理解决方案的优势。文章详细讲解了MySQL的服务器连接、数据库管理、表操作等基本命令,并通过示例演示了数据库创建、表操作和数据查询等核心功能。同时剖析了MySQL的三层架构(连接层、服务层、存储引擎层)和SQL语言分类(DDL、DML、DCL)。最后对比了不同存储引擎的特性,指出MySQL采用插件式存储引擎架构,可根据场景选择适合的引擎。全文为初学者提供了MySQL数据库的入门指南。
2025-06-02 17:07:16
692
原创 C语言输入函数对比解析
哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还精彩。咱们先上结论:fgets是输入函数界的防弹衣,其他函数可能是皇帝的新装。下面进入正片环节
2025-05-17 21:09:26
974
原创 Linux中《进程》详细介绍
可以这样,但是效率太低了,CPU的速度是以纳秒为单位的,而外设的速度是以毫秒为单位的,CPU都已经把数据处理完了,但是外设还没有把数据拷贝过来,根据木桶效应,这样会降低效率。,体现在父进程创建子进程的时候,会把父进程的PCB,拷贝给子进程,子进程和父进程的PCB大部分都是一样的,所以子进程有自己的PCB。因为一个父亲可以有多个子进程,所以如果是父进程的话,需要返回子进程的pid,便于区分,哪个是哪个子进程,而子进程返回0,是为了标识,这是一个子进程,我们不常⻅的计算机,如服务器,⼤部分都遵守冯诺依曼体系。
2025-03-30 11:29:49
724
原创 Linux中《进程地址空间》详细介绍
父进程创建时,会同时创建PCB,struct mm_struct,页表,并加载父进程对应的代码和数据,将物理内存中的地址转化为虚拟地址,再构建页表映射,子进程拷贝父进程的PCB,struct mm_struct,页表,当子进程修改数据时,OS为了进程的独立性,发生写时拷贝,再修改子进程虚拟地址映射的物理地址,所以虚拟地址是相同的,物理地址不同。在早期的计算机中,要运⾏⼀个程序,会把这些程序全都装⼊内存,程序都是直接运⾏在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。
2025-03-30 11:29:26
965
原创 Linux中《进程状态--进程调度--进程切换》详细介绍
当内存资源不足时,将wait_queue里的进程的代码和数据唤出到磁盘当中swap交换分区。如果次数键盘就绪了,OS会把磁盘当中该PCB的代码和数据再重新加载到内存,构建指针映射,这个也叫做唤入。我们把这个称为阻塞挂起,运行挂起也是同样的道理。
2025-03-29 14:17:23
1165
原创 Linux中《环境变量》详细介绍
同时bash进程内部也会维护一张命令行参数表,用户输入命令后,是bash先拿到,bash先把命令行的一串字符,以空格为分隔符进行切分,把切分的内容放到一个字符数组中,利用PATH环境变量,找到对应的指令,进行执行。当用户登陆时,操作系统会给用户创建一个bash进程,bash进程会从操作系统的配置文件中读环境变量信息,并在bash内部创建一张环境变量表,一个指针数组的样子。没错,就是环境变量的作用,环境变量里的。记录了一些指定的路径,系统默认会在指定的路径下查找,也就是说,从系统的配置文件里来的!
2025-03-29 14:16:01
1064
原创 Linux中基础开发工具详细介绍
• 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序.• 但是这样太麻烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安装.• 软件包和软件包管理器, 就好⽐ “App” 和 “应⽤商店” 这样的关系.
2025-03-13 18:35:13
821
1
原创 Linux权限介绍
Linux中的粘滞位(Sticky Bit)是一种特殊的文件系统权限标志,主要用于目录,以限制对目录中文件的删除和重命名操作.一个文件是否能被删除,与文件的rwx权限本省无关,以文件所处的目录w权限有关.任何一个人都能在共享目录下新建文件,但是不能让文件非拥有者删除文件.:假设当前用户是 user1,工作目录是 /home/user1,执行 su - user2 后,用户身份切换到 user2,工作目录会变为 /home/user2,并且加载了 user2 的环境变量和配置文件。
2025-02-19 09:32:06
820
原创 Linux中sudo命令的详细介绍
名称:sudo = Super User DO(以超级用户身份执行)作用:允许普通用户临时以 root(超级管理员)或其他用户的权限执行命令。核心价值:在保证系统安全的前提下,赋予用户有限的提权能力。
2025-02-18 14:24:09
783
原创 C++高阶数据结构 --《 并查集 》
从上图可以看出:编号6,7,8同学属于0号小分队,该小分队中有4人(包含队长0);编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的同学属于2号小分队,该小分队有3个人(包含队长1)。注意:这里的初始化状态是-1,表示一棵树,该位置是根。特点:跟堆类似,用下标表示关系, 双亲表示法(父亲)(根位置为负数,孩子位置为双亲的下标)这里表示10棵树,10个集合。
2024-12-19 09:35:19
776
原创 C++--map和set的使用介绍
set的声明如下,T就是set底层关键字的类型set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数大于比较set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。set底层是⽤红黑树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型。
2024-11-28 10:32:29
827
原创 二叉搜索树介绍
所以综合而言⼆叉搜索树增删查改时间复杂度为: O(N)那么这样的效率显然是⽆法满⾜我们需求的,后续还会继续讲解⼆叉搜索树的变形,平衡⼆叉搜索树AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。
2024-11-17 16:01:20
636
原创 C++中的stack和queue介绍
stack的介绍堆栈是一种容器适配器,专门设计用于在后进先出(LIFO)的上下文中操作,其中元素仅从容器的一端插入和提取。queue的介绍队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。
2024-10-28 20:59:13
943
原创 C++中的list介绍(常用函数)
list的文档及介绍。list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。
2024-10-22 14:59:06
800
原创 C++中的vector介绍(常用函数)
vector的文档介绍vector是序列容器,表示可以改变大小的数组。(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造int main()//无参的构造//n个val的构造//拷贝构造//迭代器区间构造return 0;
2024-10-15 14:48:32
1295
1
原创 C++中的string介绍(常用函数)
在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP。当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
2024-08-17 17:12:35
852
原创 C++--类和对象(下)
• 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。
2024-07-26 10:43:04
1075
原创 C++--类和对象(中)
析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。传值返回会产⽣⼀个临时对象调⽤拷⻉构造,传值引⽤返回,返回的是返回对象的别名(引⽤),没有产⽣拷⻉。
2024-07-25 13:36:23
874
原创 C++---类和对象(上)
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。这里我们就用Date类来做个样例class Datepublic://成员函数private://成员变量int _year;int _month;int _day;
2024-07-23 17:48:53
726
原创 插入/选择/希尔/堆/冒泡/快速/归并/计数排序——大集合
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
2024-07-19 12:22:23
1924
原创 C++入门知识
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace zx//关键字加命名空间的名字int a = 10;int val;• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量。int a = 10;int a = 20;• C++中域有函数局部域,全局域,命名空间域,类域;
2024-07-10 12:25:39
847
1
原创 判断是否为完全二叉树
1.完全二叉树的概念:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。2.思路:可以采用层序遍历的方法,把节点依次放入队列中,空节点也要放进去,在出队列的时候,出到空了,就开始遍历整个队列,如果整个队列都是空节点,则是完全二叉树,遇到非空节点,就不是完全二叉树。后面非空节点一定是前面非空节点的孩子,前面非空节点已经出了队列,那么后面的非空节点肯定也已经入了队列。这里我没有写队列的数据结构,我是写好了,直接拿来用的。
2024-07-07 19:20:25
198
原创 Topk问题
从N个数中,找出最大的前K个数,我们这里给10000个数,找出最大的前10个。个数,与堆顶的数据进行比较,比堆顶的大,就代替堆顶的数,再使用。在完成代码后,我们如何确保我们找出来的数就是最大的那几个?我们可以自己在数据文件中添加数据,明显的比原来的数据大。b.建一个K个数据的小堆,从数据文件中遍历。a.打开一个文件,将数据写入文件中。说明我们成功找出了最大的K个数。
2024-07-05 21:13:19
408
原创 C语言求完全平方数(不一样的方法)
第一种方法:使用sqrt()函数,判断sqrt() == (int)sqrt()是否相等。第三种方法:使用奇数平方和的规律,奇数平方和等于奇数个数的平方和。第二种:用小于n的数i除以n,判断i* i==n是否相等。求完全平方数,我们经常使用的有两种方法。
2024-06-15 10:17:12
2154
3
原创 用栈实现队列(C语言)
如果我们要出数据的话,我们根据队列的出入原则,应该出数据1,所以我们可以把pushst里面的数据全部倒入到popst中,那么popst中的数据为(1,2,3,4).pushst拿来入数据,popst拿来出数据,刚好可以满足队列的需求。想再出数据时,已经没有数据了,我们需要从pushst里再次倒入数据(5,6),先对popst判空,如果为空,我们需要倒入数据后,再删除数据。根据题目,我们可以知道,我们需要用两个栈来实现队列,先要对连个队列进行销毁,再对两个栈的结构体销毁。两个栈为空,队列才为空。
2024-05-25 17:51:00
1157
原创 随机链表的深拷贝
val为11的节点的前一个旧节点的random指针指向的是val为3的旧节点。因此,val为11的新节点的random指针指向的是val为3的旧节点的next指针,也就是val为3的新节点。新节点的next指针指向前一个旧节点的next指针,新节点的random指针指向前一个旧节点的random指针的next指针,值找到所对应的节点,记录该节点的位置,就像数组一样,新链表中的。并连接起来,在链接的过程中,新节点的val值等于前一个节点。解题思路二:首先在旧链表中的每一个节点后创建一个新节点,
2024-05-11 19:02:39
326
1
原创 环形链表知识点
原理:当慢指针走到圆环的第一个节点,这时快指针已经进入到了圆环当中,慢指针走一步,快指针走两步,假设慢指针走到圆环当中的第一个节点时,慢指针和快指针相差N步。按照刚才的分析方法,我们可以知道慢指针走一步,快指针走3步,那么快指针和慢指针之间相差的步数就是N+1-3 = N-2;因此,当慢指针走一步,快指针走3步,不会被追击上的条件不成立,因此,当慢指针走一步,快指针走3步时,一定会被追击上。但是,如果C是偶数,则C-1是奇数,又会造成N是奇数,就会一直追击,则追不上。如果N为偶数,则在第一轮时,就追上了。
2024-05-05 17:47:11
703
原创 C语言二分查找的区间问题
什么是二分查找呢?二分查找:在有序数组中查找某一特定元素的搜索算法。二分查找又称折半查找,通过将数组折半,用中间值和查找值作比较,多次使用,直到找到要查找的值。注意:二分查找的前提是,数组必须是要的。
2024-05-03 21:15:33
368
1
原创 程序中的编译连接介绍
链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。汇编是将汇编代码转换成可执行的机器指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列。接下来语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树。静态语义分析通常包括声明和类型的匹配,类型的转换等。在ANSI C的任何⼀种实现中,存在两个不同的环境。,生成相应的汇编代码文件。
2024-04-04 15:57:19
1066
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人