自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Git使用操作

【代码】Git使用操作。

2024-06-03 05:48:40 621

原创 GDB调试概述

今天在刷leetcode时候,有一道题我写的代码逻辑出了问题.想着进行一下本地调试的,但是碍于我的开发环境–我是用的原生ArchLinux,然后使用neovim写代码,用原生的gcc/g++编译代码,这时候调试代码就变得麻烦起来了,需要使用命令行的gdb(其实也可以使用vscode,但是我喜欢编译编译分离这样的层状开发体验,而且我使用工具向来都是最简最轻量原则,所以只好复习一下gdb了),这篇博客就诞生了.声明:这篇博客是为了满足我调试代码的需求,所以会基于我的开发环境。

2024-04-09 22:06:44 683

原创 Linux进程理解(2)

除了命令外,我们在编写代码时候,有时候也许要对进程进行控制,这种时候我们就可以使用系统调用。top工具就像是Windows中的任务资源管理器,在这里我们可以查看各种进程和设备资源状况.Linux中进程信息保存在/proc目录下,子目录是以进程PID命名..使用ps命令搭配管道和grep指令,我们可以很方便地对进程进行查看.通过这段代码,我们可以发现这里的id同时有两个返回值.对子进程返回0,对父进程返回子进程返回子进程pid.ps命令为Linux中查看进程状态的命令,通常使用。正因如此,我们在使用了。

2024-04-09 00:12:23 455

原创 Linux进程理解(1)

从面向对象的角度理解,操作系统是软硬件资源的管理者如果从面向过程的角度理解的话,操作系统是一个基本程序的集合.人类并不擅长和硬件打交道,对于现存的人类来说,很少有人能直接和主板,电源,CPU,内存,这样的硬件打交道.但是我想现在应该没人能否认互联网时代对于个人的重要性.所以就有了操作系统,操作系统相当于是计算机硬件和人类个体之间的一种媒介,对下把硬件资源做好管理工作,对上为人类提供一个便于使用的交互逻辑.从而使拥抱互联网的成本大大降低.

2024-03-28 23:43:57 677

原创 Linux权限理解

区分权限最方便的办法就是使用不同的身份,就好像我是321宿舍的舍员,我可以随意进出我们宿舍,别的学生就不能随便进出我们宿舍.在Linux中也是这样,最基本的两种身份就是root和普通用户.root就是管理员,权限自然是要比较高的,对应的普通用户权限就比较低.看似完美的权限系统背后却存在一个很致命的问题,那就是删除一个文件并不取决于文件的属性,而是取决于目录的写权限,这样就会存在一个问题,假如目录有写权限,那任何用户都可以随意删除文件,假如没有写权限又会导致文件无法删除.粘滞位就是为了解决这样的问题.

2024-03-23 23:34:48 833

原创 一篇文章带你看懂多态的本质

先引入一下前文的一些例子:去医院挂号,我去的话需要老老实实排队,但是军人会有专属优先窗口.再比如我们买票,成人票的话就是全款,但是我可以买学生票就会便宜很多.上面的两个例子中,挂号这个行为我和军人就是不同的对象,去调用时出现了不同的结果,同样的买票的行为,成人和学生不同的对象去调用也产生了不同的结果.我们可以分析一下上面提到的三个例子.挂号,我是人,军人也是人.买票,人就是人,我是学生也是人.我们可以发现,这里都存在一个继承关系,军人是特殊的人,学生是特殊的人.我们再看一遍之前的代码.

2024-01-05 19:54:34 1486

原创 一篇文章带你认识多态并学会多态的使用

计算机语言是描述世界的语言,因此多态的概念在生活中也是普遍存在的.多态就是相同的行为,不同的对象触发会产生不同的结果.比如去医院挂号,我去的话需要老老实实排队,但是军人会有专属优先窗口.再比如我们买票,成人票的话就是全款,但是我可以买学生票就会便宜很多.上面的两个例子中,挂号这个行为我和军人就是不同的对象,去调用时出现了不同的结果,同样的买票的行为,成人和学生不同的对象去调用也产生了不同的结果.类似的还有各种平台的权限控制等等这里就不在例举了.

2024-01-04 19:44:08 1598

原创 一篇文章带你深入理解继承

子类会把父类的成员隐藏掉.因为隐藏机制的存在,所以我们在实际工程中尽量避免写构成隐藏的类,这样会存在代码冗余且难以维护.

2024-01-03 16:01:55 1310

原创 markdown语法自写

markdown语法对于一个程序员来说相当重要,很多网站使用markdown编辑无论是使用体验还是工作效率都远超富文本编辑,下面我就来介绍快速上手markdown需要掌握的语法。

2023-11-21 15:18:54 57

原创 对cpp里面的引用的理解

引用其实就是对一个变量起一个,就像我们每个人也都不止一个名字。例如林冲也叫豹子头,其实都是一个人。

2023-11-16 21:06:28 51

原创 杨辉三角(c++)

是什么,这里其实就是一个二维数组,我们从外到内理解,首先这是一个vector,这里vector是用vector示例化的,就相当于是一个数组,里面的元素还是一个数组。今天我们来学习c++里面的杨辉三角题目。

2023-11-14 14:42:13 75

原创 关于C++中的类的理解

这里的public就是公共的意思,我们在类外面仍然可以访问到public的内容,而对应的private就是私有的意思,里面的内容只有在类里面才能访问得到。在类里面我们有着成员变量和成员函数的区别,如果我们通过一个类定义了两个对象,那么这两个对象理应各自掌管各自的数据,但是大家的函数都是一样的,你需要Push我也需要Push,而且实现也一样,所以对于类来说成员变量需要在类里面存储,而成员函数我们是存在公共的代码区,因此计算类的大小的时候只计算成员变量,和结构体一样需要考虑内存对齐。

2023-10-25 02:27:27 37

原创 关于内联函数的知识点

2、内联函数只是建议编译器展开代码,但是决定权在编译器。因为如果函数的内容比较多,而且频繁调用的话,会导致代码经过预编译之后代码量线性增长,导致代码体积膨胀。所以这里只是建议编译器将内联函数展开,具体展开与否还是要看编译器本身。所以c++里就引入了内联函数。3、内联函数不支持声明和定义分离,因为内联函数本身就是通过代码的替换来提升运行效率。1、可以提升运行效率,就和宏一样,代码的直接替换可以使得一些逻辑简单的操作不通过调用函数实现,从而减少了系统开销。内联函数是c++中的概念,它和C语言中的宏有些类似。

2023-10-25 01:39:48 344

原创 二叉树的实现

二叉树是数据结构中一种相当重要的结构,对于日后的学习和我们对数据结构认识的提升都有着举足轻重的作用,今天我就带大家来一起学习一下二叉树。首先学习一种数据结构,我们要首先认识一下对应数据结构的节点内容,对于二叉树来说,首先应该包含一下节点对应的数据本身,接着的话,二叉树应该有两个子树的地址,那一共应该是有三个元素,我们可以先把这一部分写出来。

2023-10-24 09:22:07 28

原创 如何根据前序和中序遍历来写出二叉树

我们先通过前序遍历来确定根,以这个题为参考的话就是B,然后我们在中序遍历里面找到B,既然是中序遍历,那么B左边的就是左树,右边的就是右树,所以我们现在可以确定CDEFAG都在B的左树。前序再接着是D,根据我们画的图里面D已经是叶子了,直接看右树,再往后就是E,再看中序,按照E左右分。再接着看前序遍历,下一个是C,再看中序里面,C左边都是左树,C右边都是右树。比如像这种题型,我们就需要依靠前序和中序的遍历来写出二叉树。再看前序就是F了,所以最后的结果就是。按照这样就可以写出二叉树了。

2023-10-20 22:57:31 61

原创 数据结构之队列

本期我们来讲一下队列,队列也是一种线性的数据结构,具体表现为先进先出。因为它先进先出的特性,所以我们还是使用链表来实现会效率高一些。然后再接着写出队列的结构,队列的话因为我们是链表实现,头删效率很高,但是尾删因为要找尾所以效率很低,我们干脆直接把尾节点的指针写在结构里面。因为我们插入或者删除数据都会涉及节点的创建和销毁,所以我们还要写一个节点创建的函数。我们首先要创建一个队列的数据结构,因为是链表实现,所以我们要先写出一个节点的结构。首先是插入函数,因为队列都是后进,所以就相当于是尾插。

2023-09-30 16:48:57 23

原创 数据结构之栈

栈是一种对数据的存储方式,栈对数据要求后进先出,但是栈并不规定使用顺序表还是链表作为实现的方式,根据栈后进先出的特性,我们使用顺序表来实现会比较方便一些。接下来我们就来写一个栈。要写一个栈首先要创建一个栈,我们从使用场景来看的话我们对于栈顶元素的调用会很频繁,所以我们要用顺序表来实现的同时应当有一个标记来记录栈顶元素的下标。对于栈的应用方面,通常只是对数据的存储和调用,或者是对栈顶元素的调用,几乎不存在对某个特定元素的查找或者修改。所以我们就通过添加元素和删除元素的接口来学习栈。

2023-09-11 04:55:41 36

原创 数据结构之链表

链表算是我们学习数据结构的过程中遇到的第一个拦路虎了,今天我们就来一举拿下链表。要学习链表首先我们需要创建一个链表,我们链表里面是要存储一种数据,我们假定我们存储 int 类型的数据,那我们先重定义一下 int。链表嘛,我们肯定是要把各个数据给链接起来的,那我们就要先创建一个链表的节点类型,我们创建的结构体中包含两个变量,一个存我们的数据,另一个存我们下一个节点的地址方便我们访问。接下来就是我们接口的书写了,我们首先应该写一个创建节点的接口。

2023-09-08 01:36:17 28

原创 密码检查——C语言实现

接下来就是check的实现,因为我们要求只能出现数字和大小写字母,所以肯定是要遍历这个字符串的,所以我们就可以先判断第二个条件,首元素不能是数字,同时判断字符串长度至少为8。因为我们后面要做判断至少出现其中两种,所以我们可以写三个变量来记录每种类型出现的次数。这样我们就只需要写一个返回值为bool的函数check()就可以完成了。最后判断a,b,c是否符合要求就完成了。接着完成框架和函数的链接就完成了。这道题首先我们先写出框架。接着就是要遍历这个字符串。

2023-08-25 18:48:12 96 1

原创 数据结构之顺序表

今天要讲的是数据结构里面的顺序表,顺序表是物理上连续的一种数据结构,和数组类似,其实也就是数组更加规范化,标准化之后定义的一种数据结构。下面就让我们一步一步完成顺序表的实现吧。

2023-08-13 07:27:43 31 1

原创 数据结构之合并两个有序数列

这道题的思想的话,还是和上一道题移除元素的思想是一样的,都是采用双指针的的想法,分别取两个数组中的有效元素,因为第一个数组后面的元素是0,所以我们要从后往前插入元素,又因为合并之后的数组是非递减的,所以我们要比较有效元素,选大的插入到第一个数组的最后。然后我们处理一下这道题。题中给我们的两个数组不是随便给的,是有要求的,第一个数组前面m个元素随便给,但是后面n个元素是0,然后第二个数组就有n个元素,意思是合并数组之后第一个数组后面的n个0就不要了,剩下的元素按照非递减排列。

2023-07-27 20:38:45 98 1

原创 数据结构——移除元素

先献上题目:力扣。

2023-07-26 01:49:24 120 1

原创 数据结构之时间复杂度

目录2、怎么计算时间复杂度那我现在提出一个问题,二分查找的时间复杂度还有一个类似的斐波那契算法。

2023-07-24 02:43:53 42

原创 C语言程序环境和预处理

今天来讲一下C语言的程序环境和预处理。

2023-07-18 01:09:36 42 1

原创 C语言文件操作

C语言的文件操作算是C语言的精髓,也是非常难的一个点。下面让我们来了解一下C语言是怎么进行文件操作的。

2023-07-17 18:41:43 72 1

原创 C语言动态内存管理(malloc,free,calloc,realloc)

先来理解这个返回类型,malloc是向内存申请一块空间,那这个void*的返回类型就很好理解了,就是把申请的这块空间的地址返回来,因为是void*,我们需要什么指针类型完全可以自由转换。这里有挺多细节的,如果我们申请的空间后面的部分无法申请,那么realloc会去别的地方找一块空间申请来用,并把之前的空间还给操作系统,所以我们使用realloc之后要更新接收空间的变量。与malloc对应的一个函数是free。返回类型为void说明没有链接属性,参数为void* ptr,这里的参数是向内存申请的空间的地址。

2023-07-15 22:52:15 57 1

原创 C语言自定义类型解析

这里我们创建了两个结构体变量,我们依次分析,先看s1,第一条规则c1在偏移量为0的地址处,如果没有对齐,i应该在偏移量为1的地方,但是这里需要对齐,按照规则二和规则三,i要发生偏移,i的大小是4个字节,默认对齐数是8个字节取较小值就是4,所以i在偏移量为4的地址处对齐,占有的字节偏移量分别为4,5,6,7。那么我们学会了s1的分析,s2就很容易了,c1对齐数1,c2对齐数1,i对齐数4,那么偏移量c1为0,c2为1,i为4,这样一共8个字节,最大对齐数4,所以8满足倍数关系,所以结构体大小就是8。

2023-07-12 22:37:02 36 1

原创 memcpy,memmove模拟实现

我们要模拟实现首先要创建这个函数,为了使这个函数具备链接属性,我们设定返回类型为void*,参数设置首先我们要有拷贝的目的地char* dest,也要有拷贝源char* src,还要再设定一个无符号数size_t num 来表示拷贝多少个字节。其实这个函数就是还是字符串拷贝,只是相比较起memcopy多了个判断条件,假如src比dest小,那我们干脆倒着拷贝,这样就不会导致后来拷贝的内容被破坏掉。假如我要拷贝两个字节,我第一个字节拷贝过去之后,拷贝第二个字节的时候会发现要拷贝的第二个字节已经被破坏了。

2023-07-11 20:27:53 47 1

原创 C语言strcpy模拟实现

首先根据我们上面的代码,printf("%s",strcpy(p2,p1));可知这个函数的返回类型是char*,有两个类型为char*的参数。那么我们可以先创建这个函数,用des表示我们目的地就是我们拷贝得到的字符串,source表示我们拷贝的内容。strcpy的头文件是<string.h>,含义是字符串拷贝,顾名思义这个函数的作用是把一个字符串拷贝到另一个字符空间里。因为我们最后要返回拷贝得到的字符串的地址,所以需要先创建一个临时变量用来作为返回值返回。运行结果如图,就是把p1拷贝进了p2里面。

2023-07-10 15:57:45 55 1

原创 C语言strcat模拟实现

首先为了使这个函数具备链接属性,我们让它返回类型为char*表示追加之后的字符串首元素地址,然后函数参数应该包括一个源和目的地,即是我们想要对其追加内容的字符串和追加的内容,这两个参数类型都应该是char*类型。接下来我们要想我们不能传进来空指针吧,如果目的地是空指针,那我们追加到哪里去呢,如果源是空指针,那我们追加什么呢,所以我们进入函数内部,先对其进行断言,断言记得添加头文件<assert.h>。strcat的头文件是<string.h>这个函数的含义是字符串追加,是在原字符串后面追加上一段字符串。

2023-07-10 15:16:50 224 1

原创 C语言旋转数组

比如我们要旋转1个字符,我们先把左边一个字符逆序,因为只有一个字符,所以相当于保持不变,再把右边3个字符逆序,也就是DCB,这样就是ADCB,对比我们想要的结果BCDA,只需再把整体逆序就可完成。我们第一时间想到办法可能是创建一个新的数组,然后按照旋转之后的顺序调换各个元素的下标,但是这样实现起来及其麻烦,我们要对每个元素重新分配下标。这里k表示旋转的次数,lenth表示字符串的长度。这样就完成了旋转字符串。我们就以ABCD为例,先创建一个字符数组存放ABCD。实现一个函数,可以左旋字符串中的k个字符。

2023-07-09 14:24:50 84 1

原创 C语言中数组名的含义

C语言中之后sizeof()和&中引用的数组名表示数组名本身,其他时候都是表示数组首元素的地址,sizeof后面的表达式并不运算,sizeof只会根据括号里内容的类型来计算占用空间大小。因为我们第一条printf是以%s打印的这个时候arr应该是字符‘a’的地址,这样才会从这里开始往后打印,直到找到后面的‘\0’;这样我们就创建好了一个字符数组arr,但是我们在讨论arr含义的时候总是会出现分歧,有时候arr表示数组名,有时候表示首元素地址,我们可以拿下面的例子来简单验证一下。

2023-07-08 16:45:16 144 1

原创 C语言扫雷游戏实现

程序分装成一些更加具体的逻辑,首先,我们要实现扫雷,当我们点开一个按钮时候会显示周围八个格子位置中雷的数目的总和,考虑到第一行,最后一行,第一列,最后一列,我们可以定义一个ROW为展示棋盘的行数,COL为展示棋盘的列数,ROWS为ROW+2来表示我们代码实现过程中使用的棋盘的行数,同理COLS为COL+2表示我们代码实现过程中的棋盘列数。然后就可以进行排雷过程了,排雷过程我们需要计算周围八个格子雷的数目,没雷的话为‘0’,有雷为‘1’,一共有八个格子所以可以把它们加起来然后减去8*‘0’;

2023-06-25 20:20:09 31

原创 数据在内存中的存储

S的取值只有0和1,S取0即为正,区1即为负。char 类型的变量占一个字节的空间,也就是八个比特位,可以存放的数据从 00000000 到 11111111 , char 类型包括 signed char 和 unsigned char ,对于 signed char 来说,这个八个比特位的最高位为符号位,剩下的七个比特位表示数据的实值,取值范围为 -128~127。对于64位浮点数来说,占用8个字节,也就是64个比特位,最高位存放S,后面的11个比特位存放E,剩下的52个比特位存放M。

2023-06-04 21:04:48 286 1

原创 C语言猜凶手问题

问题分析:这道题和前面写的猜名次问题有相似之处,但是有一个很关键的不同之处是猜名词问题中每个人对应一个名次,需要多次嵌套循环直到判断出符合条件的情况,而猜凶手问题不同,凶手本身只有一个,所以我们只需要分情况讨论凶手分别是A,B,C,D的条件下是否符合情况即可。而A,B,C,D对应的 ASC|| 码值分别是 65 66 67 68,所以我们可以让凶手对应的变量每次+1来讨论情况即可。日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。已知3个人说了真话,1个人说的是假话。

2023-06-01 16:45:56 58

原创 C语言 杨辉三角

首先分析问题,杨辉三角中的数是自己上面的数和上面左边的数相加得到,我们要想在赋值其中一个数的时候就需要调用它上面以及上面的左边的数,因此需要创建一个二维数组,那么这个二维数组需要创建多大的呢?通过观察我们可以得知杨辉三角的行数和列数是一样多的。创建完数组之后我们就要分析数组内容进行赋值了,因为我们赋值的规律是取上面的数和上面左边的数加和进行赋值,首先第一行的数没有更上一行的数,且只有一个1,我们可以单独处理,最左边一行的数都是1,且不存在上面左边的数,我们可以在每一行赋值前对其处理。在屏幕上打印杨辉三角。

2023-05-31 15:02:20 119 5

原创 C语言猜名次问题

问题分析:说对一半就是说两种情况的可能性之和为1,比如A选手说:B第二,我第三;就是说((B==2)+(A==3)==1) 每位选手都说对了一半那就是把他们五个的话逻辑与一起结果为1。诸如这种的他们五个的名次都不包含 1 2 3 4 5,显然这样的答案并不是我们需要的,我们要让结果包含 1 2 3 4 5各一个,就可以加上一个判断ABCDE乘积为120。比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;

2023-05-29 22:46:04 105 1

原创 求一个二进制数中1的个数

求一个二进制数中二的个数,我们可以先想一下怎么判断一个二进制数最低位是不是1,熟悉操作符的朋友很容易想到只要 &1 ,如果得到1就可以确定最低位为1,如果得到0,那么最低位就是0。有一种很巧妙的办法,如果把 i-1 就相当于是破坏掉了原来的数最低位的1,而前面位的数保持不变,如果 i&(i-1) 则 i 最低位1前面位的数不变,这一位和后面的位都变成0,写一个循环,把 i&i(-1) 赋值给i,当i==0的时候循环结束,循环了多少次就有多少个1。

2023-05-27 20:57:51 43 1

空空如也

空空如也

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

TA关注的人

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