- 博客(52)
- 收藏
- 关注
原创 【Linux】-进程的控制(下)
因为一旦替换成功,是会将当前进程的代码和数据全部替换的!所以自然后面的 printf 代码早就被替换了,这意味着该代码不复存在了,荡然无存!因为在程序替换的时候,就已经把对应进程的代码和数据替换掉了!而第一个 printf 执行了的原因自然是因为程序还没有执行替换。
2025-04-02 09:18:48
523
原创 【Linux】-进程的概念(下)
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不会随着进程增多而导致时间成本增加,我们称之为进程调度的算法。
2024-12-23 12:01:42
1291
原创 【Linux】-进程的概念(上)
进程是一个运行起来的程序。这句话在很多教科书上出现,但是这说了跟没说一样,什么是运行起来的程序呢,跑或没跑?跑起来的程序,和没跑起来的程序?程序是文件吗?我们之前讲过,计算机的一切皆文件,文件在磁盘。本章一开始讲的冯诺依曼,磁盘就是外设,和内存与 CPU 打交道,它们之间有数据交互。你的程序最后要被 CPU 运行,所以要运行起来必须先从磁盘外设加载到内存中。因此,当可执行文件被加载到内存中时,该程序就成为了一个进程。进程状态在 Linux 内核中就是个整数int status在Linux。
2024-12-17 13:45:57
1996
原创 深入计算机语言之C++:STL之list的模拟实现
迭代器是借助结点的指针访问修改链表的,结点是属于链表的,而不属于迭代器,所以不用去管它的释放问题。因此,拷贝构造、赋值重载和析构函数,这些都不需要自己实现,默认生成的可以。
2024-12-11 12:58:38
1847
原创 深入计算机语言之C++:STL之list的认识和使用
我们已经学习过 string 和 vector 了,想必大家已经掌握了查文档的技能。现在我们要学习如何使用 list,最好的方式仍然是打开文档去学习!是允许你在任意位置进行 插入删除的顺序容器,可以根据需要自动增长或收缩,并提供双向迭代器。双向链表中每个元素存储在互不相关的独立结点中,在结点中通过两个指针指向其前后元素。③ list 与 forward_list 非常相似:它们很相似,最大的不同 forward_list 是单链表,只能向前迭代(也让其因此更简单高效)。
2024-12-03 13:18:54
2382
原创 【Linux】-环境开发工具
目构建这个话题说人话就是:关于你的项目和编译的话题。对于项目构建的话题,一直用 VS 的同学可能会感叹道:" 诶……我就从来就没这样的困扰,我在 VS 下创建多文件,运行直接特喵的 Ctrl + F5 就完事了 "确实,编译时你需要按个键就能做到编译调试运行,编译个项目真的轻轻松松。那是因为编译器在替你负重前行, VS 会帮你自动维护了对应的项目结构!上述问题你在 VS 下压根就没关心过,因为 VS 下都帮我们屁股擦得干干净净 ~你只需要在你的 VS 下需要就创建,需要就创建。
2024-11-25 19:15:00
1599
原创 深入计算机语言之C++:STL之vector的模拟实现
public:private:// 开始位置// 结束位置// 容量我们发现 —— 怎么成员函数和我们之前模拟实现 string 的写法不一样了?不要慌,我们参考的是 STL3.0 的写法,它给的就是 start 、finish 和 end_of_storage。虽然表面上看起来不一样,但是实际上表达的效果是大同小异的,看图:我们用指针记录 _start 、_finish 和 __end_of_storage 的位置,只需要 "指针减指针" 就可以得到大小或容量。这种写法非常的自由。
2024-11-21 18:59:26
1888
原创 深入计算机语言之C++:STL之vector的认识和使用
在 C 语言中,数组是一组相同类型元素的有序集合。与字符串类似,它的大小在编译时就已经确定,不可更改。同样与 string 类似,C++为了更加方便就引入了一个支持可动态大小数组的序列容器 vector。
2024-11-18 19:16:16
1546
原创 深入计算机语言之C++:String的模拟实现
传统写法和现代写法就是交换 内容 和交换 指向内容的指针的区别现代写法在 string 中体现的优势还不够大,因为好像和传统写法差不多,那是因为string 在底层实现只是一个 char* 的类型,可以使用 strcpy 进行交换,只是多了两个大小和容量的成员变量。但是到后面我们实现 vector、list 的时候,你会发现现代写法的优势真的是太大了。
2024-11-13 18:38:14
1732
原创 深入计算机语言之C++:STL之string的认识与使用
STL——StandardTemplateLibarySTL标准模板库,是 C++ 标准库的重要组成部分,它不仅是一个可重复的组件库,还是个包罗数据结构与算法的软件框架。
2024-11-11 19:17:22
1522
原创 深入计算机语言之C++:模板初阶
泛型编程是一种编程风格,其中算法以尽可能抽象的方式编写,而不依赖于将在其上执行这些算法的数据形式。这个概念在 1989 年由 David Musser 和 Alexander A. Stepanov 首次提出。泛型,就是针对广泛的类型的意思。编写与类型无关的调用代码,是代码复用的一种手段。模板是泛型编程的基础。和函数模板的定义方式是一样的,template 后面跟的是尖括号 < >class 类模板名类内成员定义解决刚才的问题public:: _top(0)~Stack()
2024-11-04 19:04:39
2324
原创 深入计算机语言之C++:内存管理
C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦。为了解决这种问题,C++ 又进化出属于自己的内存管理方式。通过new和delete操作符进行动态内存管理
2024-10-31 18:25:06
1637
原创 深入计算机语言之C++:类与对象(下)
我们之前学习创建对象时,编译器通过调用构造函数,给对象赋初值。初始化列表作用与构造函数类似:它是在构造函数中以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。int _month;int _day;return 0;public:;// 隐式类型转换。
2024-10-28 19:09:22
1407
原创 深入计算机语言之C++:类与对象(中)
如果一个类中什么成员都没有,我们称之为 "空类" 。但是空类中真的什么都没有吗?答案是否定的!类有六个默认成员函数,默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。
2024-10-24 17:26:47
1216
原创 【Linux】-权限
在Linux 中,权限是控制用户对文件和目录访问的一种机制。每个文件和目录都有三种基本权限:读取(r)、写入(w)和执行(x)。这些权限分别适用于三类用户:文件的拥有者(u)、文件所属组的用户(g)和其他用户
2024-10-21 19:04:46
2382
原创 深入计算机语言之C++:类与对象(上)
C++是一门面向对象的语言,理解c++,首先要理解类和对象。C++中的类可以看成c语言中的结构体的升级版,结构体是一种构造类型,可以包含若干个成员变量,成员变量的类型可以不同。而由类声明定义的变量,我们称为对象。C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。在类里面定义的成员函数默认为内联函数(inline)
2024-10-14 18:46:31
2098
原创 深入计算机语言之C++:C到C++的过度
C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。它完善了C语言的许多缺陷,并且引入了面向对象的程序设计思想,包括面向对象的四个特性:封装,继承,多态,抽象。
2024-10-01 14:53:51
2367
1
原创 【Linux】-基本指令(上)
欢迎来到泊舟小课堂与Windows环境不同,我们在linux环境下需要通过指令进行各操作,今天要学习得就是一些常见的操作指令。
2024-09-16 17:57:52
2250
原创 探索数据结构:分支的世界之二叉树与堆
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
2024-07-04 10:37:40
1614
原创 探索顺序结构:栈的实现方式
栈(Stack)是一种常见的数据结构,它是一种“后进先出”(Last In First Out,LIFO)的数据结构。栈可以看做是一种特殊的线性表,只能在栈顶进行插入和删除操作。栈顶是允许操作的,而栈底是固定的。
2024-06-26 20:48:30
1731
原创 探索数据结构:便捷的双向链表
前面我们学习了单链表,它解决了顺序表中插入删除需要挪动大量数据的缺点,使单链表解决顺序表缺陷时,我们发现作为另一种形态出现的单链表似乎也有明显的缺陷。在部分功能实现时因为头结点的改变需要引进二级指针(或者采用返回等更为复杂的方法)导致代码更加复杂。寻找某个节点的前一个节点,对于单链表而言只能遍历,这样就可能造成大量时间的浪费。尾部以及指定位置插入、删除数据的时间复杂度为O(N),效率低下。为了解决这个问题,我们就要学习今天的主角——双向链表。
2024-06-03 10:08:37
1845
1
原创 探索数据结构:单链表的实践和应用
尾部插入删除效率还不错,中部或者头部插入删除需要挪动数据,效率低下。顺序表满了以后需要扩容,扩容本身也有一定的消耗。扩容存在空间浪费:一次扩的多了容易造成浪费,一次扩的少了可能要频繁扩容。这些大大增加我们的时间与空间成本。为了解决这个问题,就要学习我们今天要讲解的链表。链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。与顺序表不同,链表的存储数据在内存是随机分布的。链表中的最后一个结点的next指向空,next=NULL,
2024-05-27 10:10:03
2209
原创 探索数据结构:顺序表的实现与应用
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。简单来讲就是用一段物理地址连续的存储单元依次存储数据元素的线性结构,它与数组非常类似,但是相比于数组顺序表有一个非常明显的优点——可以动态内存增长空间大小我们常用的数组有很多的缺点:而使用顺序表的动态开辟的数组存储就方便很多静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空 间开多了浪费,开少了不够用。
2024-05-22 19:19:23
1801
原创 探索数据结构:入门及复杂度的解锁
数据结构与算法数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合,它涉及到如何组织和存储数据,以便在程序中进行高效的访问和操作。数据结构类型名称定义数组(Array)一组连续的内存空间,用来存储相同类型的数据。链表(Linked List)由一系列节点组成,每个节点包含数据和指向下一个节点的指针。栈(Stack)一种后进先出的数据结构。队列(Queue)一种先进先出的数据结构。树(Tree)由节点和边组成的层级结构。
2024-05-20 10:25:27
1617
原创 环形链表详解
环形链表是一种特殊类型的链表数据结构,其最后一个节点的"下一个"指针指向链表中的某个节点,形成一个闭环。换句话说,链表的最后一个节点连接到了链表中的某个中间节点,而不是通常情况下连接到空指针(null)。
2024-05-07 15:18:45
1091
原创 深入C语言:动态内存管理魔法
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。int arr[0];//柔性数组成员部分编译器可能会报错,struct S {int n;int arr[];//柔性数组成员结构中的柔性数组成员前面必须至少一个其他成员。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
2024-04-29 19:02:38
1216
原创 深入C语言,发现多样的数据之枚举和联合体
枚举的定义与结构体类似enum 枚举类型名标识符1,标识符2,枚举类型名受自己定义,如:week,year…,标识符就是其中的枚举常量,如Mon,Tues,Wed…每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从0开始递增。和结构体一样联合也是一种特殊的自定义类型,这种类型定义的变量也包含有一系列的成员,但不同的是这些成员共用同一块空间(遂也被称作共用体)union UNchar c;int i;//定义了一个共用体类型int main()
2024-04-22 18:51:00
3889
原创 深入C语言:探索结构体的奥秘
可以定义指向结构体的指针,方式与定义指向奇特类型变量的指针类似定义方式:struct 结构体名*结构体指针名其中books是结构体名,struct_pointer为结构体指针名定义之后可以在上述定义的指针变量中存储结构变量的地址为了使用指向该结构的指针访问结构的成员,必须使用->运算符struct stu // 结构体类型 或 结构体名char *name;//姓名int num;//学号int age;//年龄char group;//所在小组//成绩//结构体指针char *name。
2024-04-15 19:41:43
2596
1
原创 深入C语言内存:数据在内存中的存储
大端存储模式:指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中小端存储模式:指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中具体是什么意思呢~首先我们得知道内存中数据是以16进制表示的int a=0x11223344//十六进制小端存储44332211低地址 高地址大端存储11223344。
2024-04-08 19:37:22
3221
1
原创 高精度算法(加、减、乘、除,使用c++实现)
在我们进行计算的过程中,经常会遇到的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,和的数据范围显然是不够使用的了。因此这时,我们就需要引入一个新的算法,叫做高精度算法:它是处理大数字的数学计算方法,在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除等运算。思想:高精度算法本质上是用模拟数字进行计算,再利用类似于数学里的,一位一位进行相关计算。
2024-04-02 20:13:03
4686
1
原创 深入C语言库:字符与字符串函数模拟实现
C语言的库函数,是我们经常在编写程序所用到的函数,我们可以借用库函数去实现各种各样的功能,在本篇文章,我们介绍的是C语言中字符串和字符的相关库函数,以及他们的模拟实现,通过模拟实现我们可以深入了解到库函数的工作原理,以便今后更好的使用。我们在学习C语言的过程中,除了使用最多的头文件,还会使用其他头文件,利用其中的库函数帮助我们简化代码的过程,比如像,等头文件,而今天带大家详细了解一下吧。
2024-03-25 20:40:31
2159
原创 深入C语言指针,使代码更加灵活(三)
在讲解函数指针变量之前,我们先思考一下什么是函数指针变量,我们可以同数组指针变量进行类比:数组指针—是指针—是存放指向数组的指针,是存放数组地址的指针;函数指针—是指针—是存放指向函数的指针,是存放函数地址的指针;数组是有地址的,那么函数是否也有地址呢?运行结果:我们发现:确实打印出来了地址,所以,我们可以通过 &函数名 的方式来获得函数的地址。
2024-03-18 19:56:37
2224
原创 深入C语言指针,使代码更加灵活(二)
在这里我们使用 &arr[0] 的方式拿到了数组第⼀个元素的地址,但是其实运行结果如下:我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名其实就是数组首元素(第⼀个元素)的地址。
2024-03-11 20:27:35
2279
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人