自定义博客皮肤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)
  • 收藏
  • 关注

原创 Linux:动静态库

库是写好的,现有的,成熟的可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人都从零开始写,因此库的存在一样非同寻常本质上库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。静态库:.a[Linux]、.lib[Windows]动态库:.so[Linux]、.dll[Windows]

2025-05-31 16:52:04 1066

原创 Linux:文件系统

在Linux中文件的内容和属性是分开存储的,而文件的内容存储在磁盘中的Data Blocks,属性则存储在磁盘的inode Table中,并且对于Linux下的一切文件,都要有自己的属性集合(结构体),大小固定为128字节,由于。,这是因为我们要通过inode编号查找对应的文件,而每一个目录下的文件名是唯一的,因此对应的inode编号就是唯一的,所以对于每一个分区来说只能有唯一的文件名和inode编号。因此,软连接相当于Windows下的快捷键,其文件内容就存储着指向目标文件的路径。

2025-05-28 21:21:14 1145 1

原创 Linux:缓冲区

1823810 {1421 }2224 {2729 {32 }34 {37 }39 {42 }43 else44 {45 }464950 //创建文件52 }5355 {57 return;61 }6264 {65 //拷贝6869 //刷新71 {73 }75 }7678 {81 }

2025-05-21 15:58:31 972

原创 Linux:基础IO

文件存储在磁盘中,由于磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的;磁盘也是外设,因此磁盘上对文件的所有操作本质是对外设的输入和输出。

2025-05-17 16:19:43 1079

原创 Linux:进程控制2

812151819 //最新退出码2123 {26 }2729 {32 }3335 {38 if(pwd!50 }5152 // / /a/b/c路径获取切分54 {58 {60 }65 }666769 {7073 }7475 //1.输出命令行提示符77 {82 }8384 //2、获取命令行86 {

2025-05-13 21:07:09 991

原创 Linux:进程控制1

在上面代码中,我们使用waitpid函数等待进程PID为id的子进程,状态为status,然后子进程的退出码我们设为为1,但是从下面结果我们可以看到status的值并不是1而是256,这是为什么呢?在上面代码中,我们期望使用fopen函数以只读方式打开一个不存在的文件"log.txt",由于文件不存在所以程序虽然能正常执行完毕但却没有实现打开文件的功能,其退出码应该为2 ,但是由于我们自己设置了返回值为13,所以其退出码为13。如果等待子进程,子进程没有退出,父进程会一直阻塞在wait调用处。

2025-05-07 19:18:08 786

原创 Linux:进程优先级及环境

在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1myprocess.c代码如上面myprocess.c代码所示,子进程会一直执行,而父进程执行三次之后就会退出,因此子进程就会成为孤儿进程,子进程就会变成后台进程 ,如下图所示 孤儿进程要想杀掉,不能使用Ctrl + C,只能同时打开两个XShell通过kill -9 + pid进程得到CPU资源的先后顺序就是进程优先级目标资

2025-05-03 16:23:36 1059

原创 Linux:进程及进程状态

僵尸状态是为了获取退出信息,我们知道每一个子进程的创建都是让子进程完成某种事情的,因此在子进程完成任务退出之前必须让父进程获取到相关结果子进程才能退出,如果父进程没有回收子进程那么子进程就会一直存在,此时的状态则称为僵尸状态。如上图所示,如果程序中没有fork这行代码,那么程序的执行结果应该为第一行和第二行(他们的PID相同),但是由上图可知,使用fork创建了一个子进程,并且子进程的PID和之前的PID不一样。若创建进程成功,那么fork会返回子进程的进程ID(PID)给父进程,返回0给子进程;

2025-04-29 08:58:53 690

原创 Linux:git和gdb/cgdb

当我们不想使用display观察打印变量的值时,使用undisplay + 对应变量的编号就可以了,如下图所示,当我们不想观察result的值的时候,由于result的编号为2,执行undisplay 2命令就取消对result的值的观察打印了。如上图所示,分别有1,2,3三个断点编号的断点,当我们想要删除18行的断点时(即编号为2的断点) ,我们就可以直接使用命令的 d 2,然后我们在info查看断点信息,果然18行的断点就被删除了。,在演示中即将lesson4这个目录推送到仓库;

2025-04-24 21:24:02 734 1

原创 Linux进度条

库的含义:库是一套方法或者数据库,为我们开发提供最基本的保证(基本接口,功能),加速我们二次开发。在Linux中,以.so结尾的文件称为动态库。假设我们自己的程序在运行时需要调用库中的方法,程序运行到需要调用库中方法时代码会在库中找到该方法,并跳转到该方法中执行该段代码完之后返回才执行后序代码的链接方式称为动态链接。在Linux中,以.a结尾的文件称为静态库。 在程序编译时,将所有需要的库函数的代码直接复制到可执行文件中的链接方式称为静态链接。 make是一个命令makefile是一个文件,m既可以大写也可

2025-04-22 08:48:26 742

原创 Linux权限

如上图所示,对于text1.c,text2.c和text3.c这三个文件来说,所有者拥有读和写权限,所属组拥有读权限,其他用户拥有读权限。这里解释一下为什么777就拥有读、写和执行的权限,这是因为就所有者举例,所有者是否拥有读权限可以用二进制的0/1表示,所有者是否拥有写权限可以用二进制的0/1表示,所有者是否拥有执行权限也可以用二进制的0/1表示,因此,使用三个二进制数字就可以表示权限,按照二进制的权值我们可以知道,拥有读权限就是4,拥有写权限就是2,拥有执行权限就是1,不具有权限就是0。

2025-04-17 07:49:18 870

原创 Linux基本指令2

Ctrl + C:终止异常程序上下(↑↓)键:查看历史命令tab键:快速按两下,自动搜索补全命令如上图所示:在界面上输入wh之后然后快速按两下tab键,系统就会自动搜索出以wh开头的命令Ctrl + R:搜索历史命令如上图所示:在界面上按下Ctrl + R之后,就会出现第一张图所示的界面,然后我们就可以输入我们想要查找搜索的命令就行,如上图所示,我在界面上输入了wh之后就自动给我匹配了这条命令Ctrl + D:退出当前用户history:打印出历史上输入的命令。

2025-04-13 15:43:49 902

原创 Linux基本指令

如上图所示:echo "aaaa" > hello.c命令将“aaaa”输出重定向到hello.c这个普通文件中,>重定向符号,将原本输出在显示屏上的内容输出在hello.c这个文件中,当我们使用echo "hello" > hello.c命令后,就会将hello.c文件中的内容覆盖。通过echo>文件名,注意>两边没有空格会将文件内的内容清空,我们可以看到使用echo>hello.c命令后hello.c的大小由6变成了1,使用cat打印hello.c的内容时也是输出一行空白行。

2025-03-08 21:21:18 843

原创 Linux:基本开发工具

三种模式1.命令模式2.插入模式3.底行模式vim的操作打开,关闭,查看,查询,插入,删除,替换,撤销,复制,粘粘等操作。

2024-11-10 15:44:00 1232 1

原创 C++:二叉搜索树

此时我们需要多定义两个指针,一个指向被替换节点,一个指向被替换节点的父节点,此时被替换节点replace节点指向要删除节点的右节点,如果replace节点不为空,那么一直更新replace节点的位置,直到找到右子树中的最左节点,此时replace节点就是最左节点,将cur节点的值和replace节点的值交换,如果replace节点位于其父节点的左侧,将replaceparent节点的左节点指向replace节点的右节点,否者将replaceparent节点的右节点指向replace节点的右节点。

2024-09-16 11:23:58 833 1

原创 C++:STL之vector

使用vector需要包含头文件 #include<vector>vector的构造(constructor)构造函数声明接口说明vector() (重点)无参构造用n个val初始化并构造vector(const vector& x) (重点)拷贝构造使用迭代器进行初始化构造。

2024-09-12 21:15:33 1158

原创 C++:string类

C++ std::string类介绍在C++中,std::string类是标准模板库(Standard Template Library,STL)d 一部分,它提供了对字符串的封装,使得字符串的处理变动更加方安全和高效。与传统都C语言分隔字符串(字符串是以'\0'结尾的一些字符的合集)相比,std::string类提供了丰富的成员函数来执行各种字符串操作,如连接、查找、比较、替换等等,同时自动管理内存,减少了内存泄漏的风险。

2024-08-07 20:45:23 1422

原创 C++:数据内存分布和模版

由上面两个例子的对比,我们可以看出当对自定义类型使用new来开辟空间时,编译器会自动调用构造函数。而对于内置类型malloc和new的几乎没有区别int main()free(p1);delete p2;return 0;delete p2;free(p3);

2024-07-27 19:01:31 926

原创 C++:类和对象2

6.我们不写编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说内置类型成员变量的初始化是不确定的,看编译器。要注意默认构造函数不只是编译器默认生成的那个构造函数,实际是上无参构造函全缺省构造函数也是默认构造函数。一个类,我们在不写的情况下编译器会默认生成6个默认成员函数,分别是构造函数,析构函数,拷贝构造函数,拷贝赋值运算符重载和取地址运算符重载。如果一个构造函数的第一个参数是自身类型的引用而且任何额外的参数都有默认值,则该构造函数也叫做拷贝构造函数,也就是说拷贝构造是一个特殊的构造函数。

2024-07-25 17:38:01 1072

原创 C++:类和对象1

类定义在面向对象编程中是一个核心概念,它定义了对象的结构和行为。在C++中,类定义包含类的名称、数据成员(也称为属性或者字段)和成员函数(也称为方法或者操作)多个部分。数据成员定义了对象的状态,而成员函数定义了对象可以执行的操作。下面我们将堆类定义的各个部分进行更加详细的认识。类域从类的左大括号 { 开始,到右大括号 } 结束。在这个范围内声明的所有成员都属于类域。

2024-07-15 20:51:36 1108

原创 C++:入门基础

定义命名空间,需要使用到namespace关键字,后面根命名空间的名字,然后再加一对{}即可,其中{}中的信息即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义了一个域,这个域根全局域各自独立,不同的域可以定义同名变量C++中域有函数局部域、全局域、命名空间域、类域;域会影响编译时查找一个变量/函数/类型出处(声明或者定义)的逻辑,所以有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域则不影响变量的生命周期。

2024-07-12 21:38:45 234

原创 C语言:环形链表

copy节点的下一个节点指向cur的下一个节点,而cur节点的下一个节点更改为copy节点,即 copy->next = cur->next:cur->next =copy;思路:先在每一个节点后面开辟一个拷贝节点copy,拷贝节点的next指针就是cur的next指针,cur的next指针指向拷贝节点,原链表的random指向的下一个节点就是拷贝节点copy的random指向的节点,然后将拷贝节点尾插在一个新链表中,需要注意在尾插在新链表前先将原链表的cur指针重新指向head节点。

2024-05-05 16:51:47 1168 2

原创 C语言:数组

前面所学的数组被称为一维数组,数组的元素都是内置类型的,如果我们把一维数组做为数组的元素就成为了二维数组,二维数组作为数组元素的数组就是三维数组,二维以上的数组被统称为多多维数组。假设数组有n个元素,那么最后一个元素的下标是n - 1,通过数组下标我们可以轻易的访问每一个数组元素。解析:数组arr1中共有3行5列,在初始化过程中只初始化了前面两个元素赋值分别为1,2,其他元素默认初始化为0,所以为不完全初始化;存放在数组中地址被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

2024-05-04 15:42:38 1088 1

原创 C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

正确拷贝方式如下图:情况2:将数组arr1中的数据3 4 5 6 7 拷贝至数组arr1中1 2 3 4 5 的位置,即将数组arr1中的数据1 2 3 4 5改成3 4 5 6 7。

2024-04-27 11:18:26 1335

原创 C语言:文件操作(2)

主要功能:一个字符一个字符的写进文件,将int类型的字符character写进文件流(FILE* stream)中,返回一个整形。如果成功fputc会返回写进文件的字符,如果发生错误,fputc会返回EOF(-1)int main()//{// //打开文件// {// }// //成功打开文件并开始写文件//把字符a写进文件//// //关闭文件////}int main()//打开文件return 1;//成功打开文件并开始写文件。

2024-03-31 10:36:15 1347 1

原创 C语言:文件操作

磁盘(硬盘)上的文件是文件。程序文件、数据文件(从文件功能的角度来分类的)。

2024-03-29 15:21:39 1235 1

原创 C语言:结构体、联合体和枚举(3)

枚举顾名思义就是一一列举。把可能的取值一一列举。比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举月份有12个月,也可以一一列举三原色,也是可以一一列举这些数据的表式就可以使用枚举enum Day//星期Mon,Tues,Wed,Thur,Fri,Sat,Sunenum Color//颜⾊RED,GREEN,BLUE以上定义的 enum Day , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫 枚举常量。

2024-03-24 16:36:41 813

原创 C语言:结构体,联合体和枚举(2)

位段的声明和结构是类似的,有两个不同:1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。2. 位段的成员名后边有⼀个冒号和⼀个数字S就是位段struct Sint _a;//4个字节---32个bit位int _b;//4个字节---32个bit位int _c;//4个字节---32个bit位int _d;//4个字节---32个bit位//位段式结构体(位代表二进制位)struct S。

2024-03-24 11:48:59 1274

原创 C语言:结构体、共用体和枚举(1)

struct成员列表}变量 1,变量 2;注意:该种结构体类型只能使用一次,由于该结构体没有结构体类型名,如果想再次重新这个结构体可以使用typedef重新定义结构体的类型名并使用structint id;char sex;}s;int id;char sex;}STU;2.typedef 的使用int id;char sex;}STU;解析:用typedef重新定义了结构体的类型名,重新定义后结构体类型名为STU,struct stu 相当于STU。

2024-03-22 22:28:31 924 1

原创 C语言:整数和浮点数在内存中的存储

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit 位,但是在C语⾔中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器)。另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着⼀个如何将多个字节安排的问题。对于有符号的整数,三种表示方法都由数值位和符号位两部分组成,最高位表示符号位并且。:最高位不变,其余位按位取反。

2024-03-18 09:38:28 1097

原创 c语言:深入了解指针(2)

NULL) 语句时,首先判断p的值是不是一个空值0,如果变量p为NULL那么程序就会报错并终止 ,在屏幕上打印显示没有通过的代码以及包含这个语句文件名和行号,如果p确实不为NULL,assert()不会产生任何效果,继续执行下面的代码。的语句并在屏幕上打印a的值20。变量是可以修改的,如果将变量的地址传给一个指针变量,可以通过指针变量来改变这个变量的值,如果我们不想这个变量的值不能被随意更改,我们就可以使用const来修饰这个变量。我们可以看到通过const修饰的变量n不能再修改值,编译器会报错。

2024-03-13 16:14:37 1325

原创 C语言:深入理解指针1

p也是变量,是需要向内存申请一块空间用来存放地址的,由于p是指针变量是用来存放地址的,所以地址的存放需要多大的空间大小,指针变量的大小就是多大。void*可以理解为无具体类型的指针(泛型指针),这种类型的指针可以用来接受任意类型的指针,但是void*类型的指针不能直接进行指针的 整数+- 运算和解引用。因为void*类型的指针不明确指向那种类型的指针。*p解引用意思是通过p存放的地址找到指针变量指向的对象,*p相当于a,我们可以通过*p的解引用来间接改变a的值,即*p=0这个解引用操作把a的值改成了0。

2024-03-10 22:32:27 909 1

原创 C语言实现冒泡排序

代码讲解:该目标为讲数组中的元素实现升序排序。假设该数组的元素为{ 13,38,65,97,76,49,27}这7个元素。第一趟冒泡排序为第二趟冒泡排序 :第三趟冒泡排序:第四趟冒泡排序:第五趟冒泡排序:第一趟冒泡排序将数组中的最大元素排在了最后,第一趟冒泡排序共进行了6次两两元素的比较。第二趟冒泡排序将数组中除了第一趟已排序好的最大的数组中最大的元素排到了倒数第二个位置,共进行了5次两两元素的比较……由此可见,

2024-03-05 19:34:07 739

原创 switch语句

switch(表达式)case 整形常量表达式1:语句1;break;case 整形常量表达式2:语句2;break;........default:语句3;break;注意:switch括号内的表达式必须是整型表达式,case 后面必须是整形常量表达式。下面通过一个代码来说明int main()int n;switch (n)case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;

2024-02-24 17:31:31 343

原创 扫雷游戏代码讲解

由于在排查雷时如果我们排查的坐标不是雷,我们需要统计该坐标周围8个坐标雷的个数,如果我们排查的坐标为(9,9)的时候,如果我们继续访问周围的坐标就会发生数组越界问题,所以我们不妨将二维数组定义成(11,11),但是我们游戏的核心坐标为(9,9),为了之后更容易改变我们的数据,我们不妨用define定义行和列的相关信息。当input为其他值时;在此,我们不妨设想我们是否可以定义两个二维数组,一个主要用来布置雷,另一个主要用来存放排查出的雷的信息(雷的个数),另一个棋盘的初始化为了保持神秘感初始化为 *。

2024-02-23 08:08:26 939 1

原创 扫雷游戏代码

2.game.h(扫雷游戏主要代码的头文件)3.game.c文件(主要游戏核心代码)1.test.c文件。

2024-02-21 13:15:15 533

原创 C语言分支循环

第一个if语句中由于a=2判断条件不成立所以接下来嵌套的if else语句不会执行,并且else和第二个if相匹配,所以代码不执行。其中else if 语句可以有多条,但是最后一条必须是else语句。如果表达式为真,则语句执行;表达式为假,则语句不执行。由于(a=3) < (b=5)条件不成立。输出结果:什么都不输出。

2024-01-26 20:04:51 424 1

原创 我的编程学习小日记

其实花费在学习编程的时间我觉得可以视情况而定,对于自己不理解的地方我就会把我所有空闲的时间都用来去理解这个知识点,如果实在没时间的话我也会尽量每周都有一两个小时来学习编程的。我目前为一名大一的小萌新,经过一个学期对C语言的学习我对此产生极大的兴趣,尽管大一的我或许能力不高,但我会尽自己最大的努力去拼搏奋斗,努力朝着自己的梦想前进,不断钻研学习,成就更好的自己。我觉得学习编程不仅需要我们在一开始的时候背诵优秀的代码,不断积累自己的知识储备,同时也需要我们自己不断上手实践,自己在电脑上敲代码,毕竟实践出真知。

2024-01-16 22:21:29 585 1

空空如也

空空如也

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

TA关注的人

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