自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 一篇文章学会高级IO

IO是数据在传输时的一种动作描述,分为输入数据(I)和输出数据(O)两种动作。和一般而言,IO都需要维护一个收发数据的缓冲区,例如read、recv函数和write、send函数,它们的数据缓冲区都是由系统帮助创建的。对于C语言中常用到的scanf函数和printf函数,同样不需要用户自己去维护缓冲区(scanf的接收缓冲区由C语言库维护)。但是,也正是程序员无法过度干涉缓冲区的原因,IO的细节并不会直接暴露程序员,默认的一套IO机制在某些场景下可能并不合适。

2023-05-13 16:12:56 794 3

原创 网络通信之网络层与数据链路层

讲在前面由于网络层和数据链路层息息相关,因此在讲解的时候会出现两者知识点各有穿插的情况出现,在讲解网络层时仅仅可能会涉及一些数据链路层的概念,并不会造成理解上的困扰。

2023-04-30 22:52:38 1428 1

原创 网络通信之传输层协议

传输层协议其实包括UDP协议和TCP协议,这个在之前写的一篇应用层协议文章中提到过,应用层的代码实现是要基于传输层协议的。话说回来,由于UDP是面向数据报的一种协议,因此可靠性不如面向连接和字节流的TCP协议。因此TCP被广泛应用于各种网络领域的传输层

2023-04-21 22:50:51 1101 1

原创 汇编实现可见ASCII码值转字符并输出

1.定义一个字节数组,存放20H~7FH所有的数,调用dispmsg函数直接输出整个数组2.通过循环体,每次只输出一个字符

2023-04-02 00:24:49 2225

原创 网络通信之应用层协议--Linux

简而言之,应用层协议是一种数据转换成字符串的转换方式,使得程序员可以按需传送相当复杂的数据结构。并且,协议可以由程序员自己规定,只要有人认同并使用该程序员的协议,那么就可以实现正常的网络通信了。经过网络发展的几十年,一些比较成熟的协议被几乎所有的程序员所认同,例如著名的http和https,都已经写好并投入使用好多年,作为网络协议的初始学习对象是再合适不过的,但在学习http与https相关协议之前,我们不妨试着自己写一个简单的协议,具体感受一下协议的定制过程,加深对协议的了解。

2023-03-27 21:45:33 425 1

原创 网络通信--Linux

网络通信是建立在多层协议之下,最终利用数据传输线路进行数据通信。首先必须要认识到,一般我们所使用的应用软件如QQ、微信来进行通信时,数据并不是简简单单的直接通过我们的软件跑到对方的软件那么简单,中间会经过一系列的包装与解包装才行。这就涉及到了分层传输的概念,有 OSI七层模型 和 TCP/IP四层模型,其中OSI模型是逻辑上的模型,并不是特别实用,因此大多采用TCP/IP四层模型。

2023-03-03 01:28:37 1359 2

原创 线程互斥与同步--Linux

线程的互斥保证线程安全,线程同步则可以有效避免多线程的饥饿问题,这两者在生产者与消费者模型中体现的非常明显,线程的互斥与同步对线程的应用至关重要,是使用多线程的基本功。对于生产者消费者模型,个人认为理解不同角色之间的关系是最重要的,其中关于并发的理解也必须认识到位:生产任务和消费任务是可以同时进行的!

2023-02-01 15:01:40 655 2

原创 线程控制--Linux

线程控制重点掌握pthread_create、pthread_exit、pthread_cancel、pthread_join、pthread_detach这几个函数就可以

2023-01-26 10:26:05 712

原创 进程信号--Linux

信号的三个重要知识点:产生、接收、处理。其中衍生出来了许多的附带知识点,重点掌握系统函数以及信号集相关的函数。

2023-01-17 13:11:33 703

原创 进程间通信--共享内存篇

共享内存字面理解就是进程间共同享有的存储空间,不同于管道通信,共享内存就像是进程自己的空间一样,不像管道文件还得使用文件描述符去访问文件,通过文件交流信息。共享内存则是实时信息交流,几乎不存在信息的中间转换。那么共享内存在哪里呢?就真的是在每个进程中都保留一份么?也不是,开辟的共享内存在整个内存空间中独一份,但是可以通过页表映射到不同的进程中去,让各个进程都能够看到这份资源,实现通信

2022-12-15 19:53:17 1721

原创 图的关键路径(含多支交叉路径分离输出)

图的关键路径一般是在求从一个顶点到另一个顶点的最长路径,这个是建立在图的拓扑序列(传送门)之上进行的。所谓的关键路径,就是同时从一个顶点出发,无论其他路径走的怎么样,最后都得等待关键路径走完,才能到达最后的顶点。也就整个图的所有顶点访问完所需要的时间只由关键路径决定,这也是它为什么叫关键路径的原因。

2022-12-02 16:11:32 2686

原创 图的拓扑排序(入门篇)

首先要说明一点:拓扑排序是针对图这种数据结构的特有排序。百度百科对拓扑排序的定义不是特别好懂,学过离散数学才知道偏序和全序的概念,这里我就给个通俗一点的理解:访问图的顶点时,保证每次访问的顶点前面没有别的顶点(入度为0),即访问的顶点只作为弧的弧头。

2022-11-29 21:56:59 711 2

原创 图与图的深度优先遍历、广度优先遍历

图是一种较线性表和树更为复杂的数据结构,在线性表中,数据元素之间有着明显的线性关系,每个数据都有一个直接前驱和直接后继。而在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即孩子节点)相关,但此元素只能和上一层中一个元素(即它的双亲结点)相关。在图型结构中,节点之间的关系可以是任意的!图中任意的两个数据元素之间都可能相关。我个人认为,上述三种数据结构的学习难度排序为:线性表 < 树 < 图

2022-11-26 15:47:14 1263

原创 并查集解析

并查集是基于数组操作的一个特殊数据结构,和以前学习[数组的堆排序]时有点相似,只不过这次的并查集用的是双亲描述法。我们知道数组的堆排序就是为了提高排序的效率,那么并查集是为了干什么呢?这里我先不讲并查集具体的数据结构,先引入一些日常的例子来说明并查集到底是干什么的。就以老师给学生分组为例来理解。

2022-11-24 22:03:29 687 3

原创 匿名管道、命名管道--Linux

管道就是文件。这句话才是最关键的,所有关于管道的操作都是围绕文件进行的。管道作为进程间通信方式的一种,算是比较基础的了。这算是我第一次接触进程间的通信方法吧,感觉之前学习的各种知识已经串起来了,继续努力😎!

2022-11-11 20:23:39 1693 4

原创 动静态库--Linux

大伙最开始接触计算机语言–C语言时,应该都是从printf(“Hello world!\n”)写起的吧(怀念捏😏)。当时只知道必须得写上头文件stdio.h,但是并不清楚为什么要这么做。后来随着逐渐学习,又了解到原来包含的头文件是C语言提供的库哇,但是也仅限于此了。库到底是干什么的,又是怎样的结构呢?库就像是一个打包器,将你所需要用的所有函数、宏等等全都包含在内。就比如上面使用到的printf函数,首先这肯定不是我们自己写的,我们也写不出这么底层的函数,因为这需要和硬件(键盘)建立联系。那么就只能依靠会写

2022-11-09 17:43:52 765 1

原创 重定向(dup、dup2、dup3)--Linux

重定向的知识并不简单,首先得清楚文件描述符的概念,其次得知道进程替换的具体应用细节。并且还得熟练掌握dup函数族,实际应用还是比较重要的。我在整理这篇博客的时候也是又回头看了一下才疏通了知识脉络,希望正在学习的你能够从这篇文章中有所收获吧,有问题欢迎留言或私信,我们一起学习进步🐾。

2022-11-07 15:46:14 1861

原创 文件描述符与文件操作函数(open、write……)--Linux

文件描述符字面意思就是描述文件的符号。说起文件描述符,就得和进程联系起来讲。总所周知,对文件进行操作首先得在进程中打开一个文件,然后才能对文件进行读写更改属性之类的操作。说起来简单,但对于操作系统来说,做的事就比较多了。首先要解决的就是文件在一个或多个进程中以某种形式打开之后,文件怎么被管理起来。是的,文件只有被管理起来才能有序正常的被使用!由于被打开的文件隶属于被打开时所在的进程,因此文件的管理是操作系统透过进程来实现的,而文件在进程中被管理起来的形式就是文件操作符。

2022-11-04 23:38:57 896

原创 特殊类--C++

类模板作为C++面向对象的工具,我们每个程序员可是熟悉到不能再熟悉了。就一般而言,我们在使用类模板的时候,一般诉求都是类的功能越全面越好,方便我们尽可能的去实现多种功能的组合拼装。但是,在某些情况下,类的一些功能需要被舍弃或‘变异’从而达到想要的效果。这就要求我们从最基本的类上经过改装实现特殊类。🚩有哪些特殊类特殊类种类繁多,面对不同的应用场景,不同的特殊类应运而生:不能拷贝的类、只能在堆上创建的类、只能在栈上创建的类、不能被继承的类、只能实例化一个对象的类...

2022-10-10 23:14:21 356

原创 智能指针--C++

指针我们都不陌生,我们在存放或指向一个地址空间时都需用到指针。而今天我们要谈的智能指针主要将问题集中到了空间(内存)的安全使用的方面。我们在堆上申请空间后,被告知一定要进行空间的释放,否则会造成内存泄漏的问题。长期的内存泄漏会造成进程卡死的情况,这要是在一款投入使用的软件上发生了,那造成的损失就不是个人可以承担的了(亲,可以拍拍屁股走人了哈🤔)。

2022-10-08 22:08:30 604

原创 左值引用与右值引用--C++11

左值与右值引用的使用不是特别广泛,因此某些细节我可能考虑不到,有问题的小伙伴在评论区留言哦👋。

2022-10-06 19:03:11 876

原创 哈希(hash)--C++

哈希思想在处理海量数据极具优越性,往后我会进一步探索哈希的应用。今天咱就只讲一些基础的知识,为以后的拓展做个铺垫。👋。

2022-10-04 23:14:41 1104

原创 进程控制--Linux

进程控制的内容很多,并且有很多细节需要注意,涉及的基础知识也是很广泛:进程地址、环境变量、系统函数调用等等。这部分知识就先分享到这了,以后估计会有扩展的内容,那肯定是以后再讲啦。嘴贫到此结束,再见😋。

2022-10-04 13:02:56 529

原创 进程地址空间--Linux

谈及进程,我们对进程的概念并不陌生,但对于进程所在的地方,我们得搞清楚。那么我们平常写的程序运行起来之后,所在的进程是直接放在了内存上吗?其实并不是,我们平常所看到的进程地址空间是程序地址空间,也叫虚拟地址空间。这种地址空间处理实际上是对内存空间的高效利用和保护,我们后面再讲。进程之间的独立性由于写时拷贝的存在,虽然父子进程共用一套地址空间,但只要一方写入,就会自动进行拷贝分离,这样就不会出现地址冲突的问题。虚拟地址设计思路让进程或者程序可以以种统一的视角看待内存!

2022-10-01 12:02:18 2649

原创 git三板斧--Linux

git的功能有很多,我在这里只写了本地文件的上传操作。以后有机会的话会继续更新😋。

2022-09-24 22:22:22 2299

原创 Stl中map、set 容器(数据结构:AVL树、红黑树)--C++

Stl的容器中,map和set都是用的树状数据结构----二叉树!但实际上用的并不是普普通通的树状结构,而是一种设计好的,规律性极强的树状数据结构:红黑树(二叉树的一种,细节下面讲)对于map和set来讲,中序遍历依旧是有序的,而这和之前讲的二叉搜索树有点相似。

2022-09-24 17:38:07 1393

原创 二叉搜索树(Binary Search Tree)--C++

二叉搜索树又叫二叉排序树,是二叉树的一种特殊情况。树的每个节点的值都满足一定的规律,同样是以结构体为节点创造树。1.对于根节点有“左小右大”。2.对于左右子树节点有“左小右大”。呼~,总算是把二叉搜索树的主要内容讲完了,重点还在于二叉搜索树的操作那一部分,对于删除的情况分析以及递归的实现都能使我们更加了解二叉搜索树的整体结构。关于树形数据结构的知识现阶段我还在学习中,往后会继续更新相关知识的博客。👋httpshttpshttpshttpshttpshttpshttpshttps。...

2022-07-29 16:45:43 388

原创 多态详解--C++

多态的讲解涉及到了继承的知识,可以说是继承是实现多态的基础。https“多态”,顾名思义就是多种形态。C++的学习始终是面向对象的,对于不同的类产生不同的对象,做同一件事可能会产生不同的结果,造成不同的形态,这就是多态的通俗理解。virtual修饰的类成员函数称为虚函数。包含纯虚函数的类叫做抽象类(也叫接口类)。纯虚函数在虚函数的后面写上=0,则这个函数为纯虚函数。多态的重点在于虚函数相关知识的掌握,搞清楚虚函数表的作用和意义对于学习多态至关重要。httpshttpshttps。...

2022-07-25 00:52:58 698 2

原创 继承详解--C++

继承在C++的学习中是对前面类的学习的补充和拓展,总而言之,这篇文章我们还是围绕类去学习。一个类B要想继承一个类A,具体要怎么操作呢?classA{};classBpublicA//B继承A{};这里A类被称为基类(父类),B类称为派生类(子类),而中间的public则是继承方式。格式派生类继承方式基类C++支持的多继承会出现菱形继承的现象,使整个继承过程变得相对麻烦了一点,且理解困难。因此在使用继承的时候,能不用多继承就不用。类的复用除了继承之外,还有组合。https。...

2022-07-22 14:14:59 953 3

原创 Stl中list容器解析--C++

list容器与前面的vector容器很大的区别在与list是以链表为基本结构进行数据的存储的即空间不连续存储。因此list容器的学习重点在于迭代器的理解和掌握。

2022-07-16 14:35:39 452

原创 Stl中vector解析&简单模拟

vector也是Stl中比较重要的一种容器,相比较于string,vector所存储的数据类型更多,不再仅仅局限于char类型的数据。 考虑到内容要精简一点,我们挑选其中比较有代表性的功能函数来讲解。 上面我们提到vector可以存放多种数据,因此我们在模拟实现的时候优先考虑模板类,成员变量直接用模板类型。vector函数模拟迭代器模拟begin()返回值:数据的起始位置这里直接考虑返回指针变量_startend()返回值:数据末尾的下一位置这里直接考虑返回指针变量_finish

2022-07-14 13:39:45 143

原创 Linux下的文件权限管理

Linux操作系统下皆文件,这句话在我们学习Linux的时候会贯彻到底。同时,也从侧面说明了Linux的权限管理实际上就是文件的权限的管理。Linux的用户分为两种,一种是超级用户(root用户),一种是普通用户。提及用户的区别的原因在于超级用户对普通用户拥有着绝对的控制权。等会儿我们在下文谈及的普通用户的各种文件权限对于超级用户来说根本没用,超级用户不受限制。这也是超级用户的特殊性,因此下文再涉及到权限的讲解时,我们不考虑超级用户这一特殊情况。上面的文件属性最基础的涉及到文件的类型。在Linux操作系统下

2022-07-09 09:58:59 1309

原创 简单模拟实现string--C++

string是我们在学习C++的过程中不可避免要遇到的一个类,string主要处理字符串,围绕着字符串有着这样和那样的功能。实际上string有很多的功能函数,但是有些函数实用价值并不算太高,因此我们在模拟的时候会重点关注一些使用率较高的函数。首先,string是可以用来存放字符串的,因此会有 char* _str 指针变量。为了实现对字符串的一系列增删查改,我们需要动态开辟空间来存储字符串,因此也就涉及到了_str指针变量所指向空间的大小_capacity和字符串的长度_size。string类的成

2022-07-07 17:31:33 643

原创 初识模板详解--C++

目录前言函数模板定义格式实例函数模板的原理函数模板的实例化隐式实例化显式实例化模板参数的匹配原则类模板定义格式实例 类模板的实例化模板的分离编译定义模板声明与定义分离链接错误解析解决方案总结 我们以前在写代码的时候会遇到功能相似,代码内容基本一样的函数,唯一的不同点可能算是参数和返回值的不同。最简单的例子就是不同类型数据的求和(Add)等数学函数。学习C语言的时候我们遇到这种情况无非是把函数名改一改,参数改一改,多写几个函数,顶多再整一个函数指针数组来方便使用。这种做法显得非常笨,但显然这是语言限制了我们。

2022-06-08 22:48:16 251

原创 C&C++ 动态内存管理详解

在C语言中,动态内存的管理主要靠四个函数来实现,这四个函数分别是malloc、calloc、realloc、free。他们分别有不同的功能,但总体上都是在内存的堆上进行内存操作。结构:参数是开辟空间的大小,单位是字节(bite),如果开辟成功,则返回开辟空间的首地址,类型是void*,开辟失败就返回空指针NULL。结构:calloc函数和malloc函数的功能相近,但是calloc函数会把开辟的空间给赋值成0,其参数分别是开辟空间中元素的个数(num)和每个元素所占空间的大小(size),单位是字节(bit

2022-06-08 00:27:43 99

原创 友元和内部类--C++

有些时候我们在写类时,不想要第一个指针是this指针,甚至不需要this指针,但是又不得不用到类的成员变量,这就比较苦恼了。比较麻烦一点的办法就是在类内部写一些函数来返回成员变量的值,成员一多就显得麻烦。为了更好的解决这个问题,C++引入了友元函数的概念。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。日期类流输出问题:上面的代码有点怪怪的,明明是cout......

2022-06-06 21:51:10 75

原创 构造函数--初始化列表

目录前言:初始化列表的意义:初始化列表的构造:特殊类成员的处理:初始化顺序:我们在C++中引入初始化列表的原因何在?对于这个问题,我们先回头想想类在实例化的时候,一定会用到构造函数,那么实例化的过程中类成员变量的定义肯定是在构造函数里面了。问题在于是不是在构造函数内部初始化的时候定义呢?接下来我们就探讨一下。构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。最为重要的是,一些特殊的类成员,必须放在初始化列表位置进行初始化:1.引用成员变量2.co

2022-06-01 00:50:08 1497

原创 类与对象(中)--C++

目录类的默认成员函数六种成员函数:1.构造函数2.析构函数3.拷贝构造函数4.运算符重载5.默认 拷贝函数与赋值运算符重载函数6.const成员函数类的默认成员函数我们在定义类的时候,类里面其实默认生成六个函数,在涉及到使用它们的情况下就会默认调用这些函数。(即使是空类也会有默认成员函数)六种成员函数:构造函数、析构函数、拷贝构造函数、运算符重载、默认拷贝构造与赋值运算符重载、const成员函数我们以日期类来进行以下函数的说明1.构造函数我

2022-05-19 18:44:41 197

原创 类和对象(上)--C++

目录前言:类的定义:类的访问限定符及封装:限定符:封装:类的作用域:类的实例化:类对象的大小:this指针:this指针的特点:总结:前言:就普遍而言,c语言在解决问题时讲究的是过程,而C++更关注问题中的对象。就好比 “完成作业” 这个事件吧,c语言会关注 “写作业”,“上交给学委”,“学委整理作业”,“老师批改作业”,“分发作业”这样的过程。但是C++会关注“学生”,“学委”,“老师” 这样类似的对象。而类呢,就相当于c语言中的结构体,

2022-05-12 23:53:06 202

原创 引用和内联函数--C++

引用:在c语言的学习过程中,我们已经接触到了指针这个概念。利用指针,我们可以很轻松的对指针所指向的内容进行改动。这里的指针也是需要变量来储存的。而在c++中,有一种操作“引用”也可以实现类似的功能,但是不需要开辟新的空间来储存。定义:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。结构:类型& 引用变量名(对象名) = 引用实体例如:#include<iostream>int m

2022-05-11 18:46:08 231

空空如也

空空如也

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

TA关注的人

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