- 博客(44)
- 收藏
- 关注
原创 深入理解软硬链接
硬链接不是独立的文件,没有独立的inode,硬链接本质就是一组文件名和已经存在的文件的映射关系。同理,如果我在communication文件夹下创建3个文件夹,那么communication目录就会有5个硬链接数,因为../指向上一级目录。2.硬链接,inode结构体中的count会减一,但是文件数据块不会被删除。硬链接还是可以使用。1.软链接,空有原文件的地址,找不到原文件,软链接失效。软链接有独立的inode,软链接内容上,保存的是目标文件的路径。2.硬链接,本质是多个文件名共用一个inode。
2025-02-06 22:54:43
401
原创 深入理解linux中的文件(下)
在Unix/Linux文件系统中,每个文件都有一个对应的inode,它存储了文件的元数据(如权限、所有权、大小等)以及指向文件数据块的指针。当我们获得了某个文件的inode编号(例如13425),接下来需要定位并读取该inode的具体信息来访问文件的内容和属性。每一个数据块是4KB大小,里面存放文件的内容,当然,数据块,也会存放指针。这些指针指向其他的数据块,也就是一个数据块有1KB的指针。:一旦找到了正确的inode结构体,我们就可以使用其中的信息来定位文件的数据块,进而读取文件的实际内容及其属性。
2025-02-06 22:11:30
1053
原创 深入理解linux中的文件(上)
1.前置知识:(1)文章 = 内容 + 属性(2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中)如果不打开文件,文件就在磁盘中(3)谁会去访问一个文件,进程。进程被加载启动之后,运行到fopen,才会打开一个文件(4)手绘的进程和文件系统之间的交互图mode。
2025-02-02 00:00:23
942
原创 vscode远程连接linux云服务器(包含自己的输入密码一直显示不对的解决办法)
本篇内容是我自己在使用vscode远程连接云服务器中出现的问题和解决办法,希望我的这篇文章可以帮助到你!
2025-02-01 23:27:56
205
原创 L1-059 敲笨钟
/通过找句号:字符串大小-1 表示最后一个字符。类的一个成员函数,它的作用是将一个反向迭代器转换为其对应位置的正向迭代器。但是要注意,由图可知,respace不支持反向迭代器参数,我们需要先把他转成正向迭代器。进行if判断 : if (a == "ong" && b == "ong")替换:通过反向迭代器找到倒数第三个空格,使用respace函数替换。反向迭代器转成正向迭代器,需要用到base函数。
2024-09-24 12:20:39
223
原创 【C++】stack和queue 适配器
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作empty:判空操作back:获取尾部元素操作。
2024-05-12 21:09:12
952
1
原创 C的内存区域:栈区,堆区,代码区,静态区,常量区
其实不然,这里表示的char类型的数组会在栈区开辟5个字节的空间,然后把在常量区的字符串“abcd\0”拷贝到数组中。存放在哪里,看它定义的时候是局部变量还是全局变量,有没有static关键字,有没有malloc函数在堆区空间开辟空间,是不是常量。*pChar3指向的是常量区的字符串“abcd\0”,所以*pChar3表示字符串的首元素a,a是存放在常量 区的。选项:A、栈区 B、堆区 C、静态区 D、常量区。*ptr1,是对ptr1指针解引用,就是堆区的那一块空间。
2024-04-08 20:44:33
580
2
原创 初识C++(四)深入了解拷贝构造函数
在这个代码中,由于 Time 类中没有显式定义一个无参数的默认构造函数(只定义了一个拷贝构造函数),而 Date 类的实现依赖于 Time 类的这个默认构造函数来初始化其 _t 成员,所以编译器将尝试调用 Time 类的默认构造函数时会失败,因为找不到合适的构造函数来初始化 _t。这个默认的拷贝构造函数会逐个拷贝 Date 类中的所有成员变量,包括基本类型和自定义类型的成员。Date 对象的默认构造函数调用:当 Date 类的对象被创建时,它的默认构造函数(编译器自动生成的,因为没有显式定义)会被调用。
2024-03-30 21:42:14
1505
8
原创 初识C++(三)构造函数和析构函数
默认生成的构造函数:内置类型的成员不做处理 ---- C++这里没有处理好,就会导致有数据的随机值自定义类型的成员做处理。
2024-03-25 20:44:33
1009
9
原创 初识C++(二)引用,内联函数,auto
接收的是引用的返回值的拷贝,从而避免直接持有悬空引用,但 func 函数的设计本身是有问题的,因为它返回了对局部变量的引用(局部变量已经被销毁)以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。在本例中,当TestFunc2被调用,并且以A&(结构体A的引用)作为参数时,它实际上是直接操作原有的对象a,而不是创建一个新的拷贝。
2024-03-24 18:24:47
1421
1
原创 初识C++(一)啥是C++,关键字,命名空间 ,输入输出,缺省函数
C++,一门充满可能性的经典编程语言。无论是游戏、系统还是嵌入式设备,它都扮演着重要角色。探索C++的历史和功能,挑战编程的奥秘,开启精彩的编程之旅!
2024-03-22 18:41:24
1232
12
原创 深入了解:二叉树(最详细,约10000字)
二叉树,是一种重要的数据结构,每个节点最多有两个子节点:左子节点和右子节点。这种简洁而灵活的结构,被广泛运用在算法和数据处理中。本篇文章将通过深入解释二叉树的概念和操作,你将掌握解决复杂问题的利器,拓展编程技能的边界。让我们一同探索二叉树的神秘世界,挑战数据结构的极致魅力,开启编程之旅的精彩探索!
2024-03-21 20:44:00
1310
4
原创 十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)
十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)十大排序的思想和代码的实现!!!
2024-03-10 19:50:01
24738
31
原创 循环队列的实现与优势
循环队列是一种常见的数据结构,通过在数组中实现循环移动的方式解决了普通队列的空间浪费问题。本文将探讨循环队列的实现原理、操作方法以及其在实际应用中的优势。
2024-03-06 18:31:29
1039
原创 快速排序(左右指针法),在写代码的时候会有陷阱
左右指针法和挖坑法大同小异,都是从右边找比key小的数,在左边找key大的数。只是不需要挖坑。我为什么还要提左右指针法呢?因为我在写这个代码的时候遇到了两个坑。
2024-02-28 19:31:44
404
原创 排序算法之快速排序(挖坑法)
挖坑法的思想:记第一个数为key,要调整key的位置,使得左边的都要比key的小,右边的数都比key的大。再从左边begin找大于28(key)的数,把那个数放在hole中,然后让hole==begin。让end找到小于28(key)的数,把那个数放到hole坑中,然后让hole==end。记录下关键字key==begin,把28那个位置挖坑hole==begin。然后arr[hole]=key;用到分治递归,就要改变函数的参数,要有left和right。再分治思想,分成左边和右边。
2024-02-27 23:11:50
549
原创 排序算法--冒泡排序
(2)3,-1,9,10,20 ----9比 -1大,所以9跟 -1交换。(1)-1,3,9,10,20 ----3比 -1大,进行交换。(3)3,-1,9,10,20 ----9跟10比较,不交换。(1)-1,3,9,10,20 ----3和-1比较,不交换。(1)-1,3,9,10,20 ----3和-1比较,不交换。(1)3,9,-1,10,20 ----3跟9比较,不交换。(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环。
2024-02-27 12:53:52
648
原创 排序算法--堆排序
用到向下调整算法,比较两个孩子的大小,选出大的孩子,与父亲比较,如果孩子大于父亲,交换。把第一个最大的数与最后一个数交换,然后把最后一个数踢出堆,继续向下调整算法,再交换次大的数。用小堆的坏处:交换之后踢出第一个数,会导致堆的错位,要重新建堆,时间复杂度O(N^2)1.堆的概念:堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二。4.建堆的时间复杂度是O(N)-->(粗略的了解原理,记住结论就行)堆排序的时间复杂度是O(N*logN),优于选择排序O(N^2)2.堆的性质:①完全二叉树。
2024-02-27 10:54:30
555
原创 深入理解--指针
前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(除对指针的操作外),那么今天来学习一下指针作为函数参数。指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。如上面,p(p + 0)指向 nums[0]、p + 1 指向 nums[1]、、、类推可得,p+i 指向 nums[i],由此可以准确操作指定位置的元素。
2024-02-21 22:00:03
1181
原创 二叉树知识点
树的高度(深度):从1开始算(为了避免空树的时候表示比较尴尬)。节点的祖先:从它的父亲开始算(包括它父亲),都是它的祖先。叶节点(终端节点):子树为0的节点。B,H,I,P,Q,K,L,M,N都是叶节点。父节点(双亲节点):一个节点含有的子节点。分支节点(非终端节点):子树不为0的节点。A,D,E,F,G,J,都是分支节点。树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。子孙:从它开始的下面的所有分支都是它的子树。A的子孙,下面的都是它的子孙。节点的度:一个节点含有的子树。
2024-02-18 12:43:37
254
1
原创 qsort函数---用快速排序的原理
/函数指针--指针指向的函数是用来比较数组中的两个元素。sqort函数的头文件是#include ,需要自己写一个比较函数(比较的方式)通过指针的移动来实现排序,排序的结果放到原数组中。void qsort ( void * base,//任意类型的指针,指向了要排序的数组的第一个元素。size_t num,//数组中的元素个数。比较函数的传参,要加const,因为只读,不修改*p。比较函数的内部,需要强制类型转换p1和p2的类型。要把两个元素的比较,抽离出来,变成一个比较函数。
2024-01-31 20:56:49
334
1
原创 回调函数--代理员
回调函数的作用:功能比一个单一的函数更加强大。通过函数的参数不一样,实现的功能也不一样。回调函数的意思:创建一个函数1,函数1的内部需要调用函数2,就把函数2指针当中函数1的形参。相同的代码出现了多份,就显得冗余。回调函数是通过其他函数来实现的,不是他自己回调。calc(Add)函数名代表的是函数的地址。
2024-01-31 17:19:59
294
1
原创 Win32 API
/可以在之后用来改变光标位置在控制台上的显示屏是有坐标的。一个窄字符占一个格。从左向右为x轴,从上到下为y轴!!!y轴的数也都是正数。(坐标系的x轴的数是按照单字符来算的)储存坐标需要COORD结构体变量。
2024-01-30 22:54:04
815
1
原创 C语言--扫雷游戏
1.初始化棋盘:一个全是*的棋盘(给玩家看到的画面),另外一个埋雷的棋盘(0代表没有雷)对于9*9的棋盘,就需要11*11的二维数组。(因为我用了game.h头文件,game.c和test.c文件,所以在下述代码有些封装起来,在文章的最后我会把完整的代码发出来)ROW代表行,COL代表列 -->用在打印棋盘,埋雷,排雷的数组中(在传参的时候ROW,COL,用小写的row,col接收)ROWS,COLS代表实际要布置二维数组的大小(初始化棋盘)(在二维数组的[ ][ ]方括号中使用ROWS,COLS)
2024-01-26 11:01:56
1071
1
原创 一级指针与二级指针的适用场景
用二级指针接收一级指针的地址,也是临时拷贝内容(一级指针的地址)一样,二级指针地址不一样的临时变量。二级指针指向一级指针的地址。就是把一级指针的地址当作二级指针的内容。p只是pa的一份临时拷贝,p与pa的地址是不一样的。当p的内容改变的时候(就是p的。在test函数中*pp(得到一级指针的地址)就可以找到p那一块地址,间接操作p中的内容。改变的时候) ,退出函数会销毁里面的内容。在函数中,一级指针只能访问一级指针指向的内容,不能对一级指针的。假设main函数中一级指针p的地址为0x1543。
2024-01-25 00:13:38
626
原创 分支和循环语句
注意点:0为假,1为真else是与的if匹配,而不是看对齐程度第一种:只写if第二种:if...else结合第三种: if...else if...else if...else复合语句为什么要用if..else if的复合语句,而不直接多个if语句呢?就是在最后的时候可以不写条件。
2024-01-24 12:19:42
1048
1
空空如也
C语言中内存区域变量名
2024-04-08
C语言中内存区域变量名和变量数据存储在哪里
2024-04-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人