- 博客(40)
- 收藏
- 关注
原创 c语言和系统的文件接口
本文介绍了C语言和系统级别的文件操作接口。C语言通过fopen()、fwrite()、fread()和fclose()函数实现文件操作,参数包括文件名、读写模式、缓冲区等。系统接口使用open()、write()、read()和close()函数,需要文件描述符作为操作对象。两种方式都提供了文件打开、读写和关闭功能,但系统接口更底层,能处理中断等特殊情况。代码示例展示了如何正确使用这些函数实现文件操作。
2025-05-24 16:19:56
822
原创 Linux进程
fork函数是在已存在的进程中创建一个子进程,而原进程为父进程。注意:父进程和子进程虽然有相同的二进制代码但是它们是两个可以独立运行的进程,而且谁先被执行完全由调度器决定。
2025-05-03 11:14:07
968
原创 Linux的环境变量
其中name是你要查看的环境变量的名称。export:设置一个新的环境变量。例如查看PATHD的环境变量。env:显示所有的环境变量。unset:清楚环境变量。
2025-05-02 10:28:28
378
原创 linux软件包管理器apt
apt可以帮我们高效的处理linux下的安装包问题,也是ubuntu系统下最常用的安装方式。注意:使用apt下载内容时要有root权限,如果是普通用户的话需要有sudo提权。
2025-04-10 09:51:18
191
原创 linux权限
linux有两种用户,超级用户(root)和普通用户,超级用户的命令提示符是#,普通用户的命令提示符是$。命令:su (用户名)功能:切换到目标用户。普通用户切换到root用户需要root的秘密,在后面可以不加有用户名。root用户切换到普通用户不需要密码,后面要接用户名。
2025-04-04 18:23:35
372
原创 AVL树的实现
AVL树,全称为Adelson-Velsky和Landis树,是一种自平衡的二叉搜索树。它由苏联数学家G.M. Adelson-Velsky和E.M. Landis于1962年提出,并以他们的姓氏命名。
2024-12-08 15:28:56
657
原创 cpp的map
还有删除(erase),清除 (clear)、查找(find)、计数(count)用法和set的用法几乎一模一样。构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该区域中的相应元素构造。1、map是关联容器,他是按照特定顺序来进行存储由key和value组成的键值队。它会返回k所对应对value,容器原先没有k则插入k并返回映射值的引用。3、map支持下标访问,将key放入[]中可以找到对应的value。通过插入新元素来扩展容器,从而有效地增加容器大小(按插入的元素数)。
2024-12-03 09:36:12
660
原创 cpp的set
如果容器的比较对象反射性地返回 false(即,无论元素作为参数传递的顺序如何),则认为集合的两个元素是等效的。由于集中的元素是唯一的,因此插入操作会检查每个插入的元素是否等效于容器中已有的元素,如果是,则不会插入该元素,而是返回此现有元素的迭代器(如果函数返回值)。如果容器的比较对象反射性地返回 false(即,无论元素作为参数传递的顺序如何),则认为集合的两个元素是等效的。下面一依次介绍每一个容器。3、set中value和key是相同的,且每个value的值是唯一的,不存在两个相同的value值。
2024-12-02 21:40:11
1297
原创 c++的list类
本篇将讲述类中的各种重要和常用函数(begin()、end()、rbegin()、rend()、empty()、size()、front()、back()、push_front()、pop_front()、push_back()、pop_back()、insert()、erase()、resize()、clear()、splice()、remove()、unique()、sort()、reverse())
2024-11-02 22:35:46
2177
原创 cpp的vector类
本篇将讲述类中的各种重要和常用函数(begin()、end()、rbegin()、rend()cbegin()、cend() 、crbegin()、crend()、size()、resize()、capacity()、reserve()、empty()、push_back ()、pop_back()、insert()、erase()、clear()。
2024-10-26 22:03:02
1360
原创 cpp的string类
本篇将讲述string类中的各种重要和常用函数(string()、begin()、rbegin()、cbegin()、crbegin()、end()、rend()、cend()、crend()、范围for、size()、resize()、capacity()、reserve()、clear()、empty()、append()、push_back()、insert()、erase()、replace()、swap()、find()、rfind()、substr()、compare())。
2024-10-25 14:04:13
817
原创 c++内存管理
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。2. 在申请的空间上执行构造函数,完成对象的构造。
2024-10-15 16:59:56
866
原创 类和对象(下)
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元分为两种友元函数和友元类。关键字为friend。3.2友元函数当我们要将operator
2024-10-14 22:39:09
658
原创 类与对象(中)
默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。4. 拷贝构造函数典型调用场景:使用已存在对象创建新对象函数参数类型为类类型对象函数返回值类型为类类型对象注意:1.在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。2.类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。
2024-09-23 12:56:27
821
原创 类与对象(上)
关键字:classclass为类的关键字,className是类的名字,{}是类的主体注意:分号不能省略。类的两种定义方式: 2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名:: 注意: 一般情况下,更期望采用第二种方式。成员变量命名规则的建议:上面这种定义可读性不高,我们不知道year是类成员还是函数传递的参数。一般来说我们推荐在类成员前加一个'_',或者加'm',如上所示。四、类的实例化 用类类型创建对象的过程,称为类的实
2024-09-18 21:42:20
986
原创 七种常见的排序算法和实现
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。 我们依次对下面排序进行讲
2024-08-22 09:48:54
1968
原创 二叉树和堆
现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;我们左节点记录孩子的节点,右节点记录兄弟的节点,若没有孩子或兄弟则指向空。兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
2024-08-21 20:03:31
870
原创 动态内存管理
动态内存的分配以及与动态内存有关的几个库函数(malloc,calloc,realloc,free),常见的动态内存的错误以及柔性数组的特点和优势
2024-07-07 16:36:24
752
原创 自定义类型:联合和枚举
联合体类型的声明,联合体的特点以及相同成员的结构体和联合体的对比,联合体大小的计算实用案例,还有联合体的练习,枚举类型的声明,枚举类型的优点以及枚举类型的使用
2024-07-07 15:48:16
915
原创 C语⾔内存函数:memcpy、memmove、memset、memcmp的使用和实现。
注意:以下使用的函数,都要包含头文件<string.h>注意:以下使用的函数,都要包含头文件<string.h>一、memcpy使⽤和模拟实现voidmemcpyvoidconst void* source,size_tnum )1、使用:•函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。•这个函数在遇到'\0'的时候并不会停下来。•如果source和destination有任何的重叠,复制的结果都是未定义的。
2024-06-05 09:35:50
702
4
原创 strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr几个库函数的使用和实现。
注意:以下使用的函数均需要包含库文件<string.h>注意:以下使用的函数均需要包含库文件<string.h>
2024-06-03 21:02:25
1077
2
原创 深入指针3
什么是函数指针呢?通过前面的学习我们不难发现函数指针实际上是一种指针,里面存放的是函数的地址,通过解引用我们可以使用函数,那我们怎么知道函数是不是有地址呢?我们做一个实验。
2024-05-23 13:55:40
589
8
原创 深入指针2
这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是 ⾸元素的地址,+1就是跳过⼀个元素。但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。如图,我们将一个指针数组,指向三个不同的数组,作为行,然后,将每一个数组作一行。如上所述,访问数组可以用指针的形式进行,当有一个数组arr,且指针指向arr时就有。我们举个例子:整形数组,字符数组,浮点形数组,他们都是数组,因此,
2024-05-21 18:25:03
409
3
原创 深入指针1
我们知道指针变量是储存地址的,长度固定为4/8个字节,那为什么定义指针时还要有不同的类型呢?其实这是为了查找完整的数据,其实指针变量储存的只是第一个字节的地址,那这个数据到底多大?都是不知道的,因此我们需要给指针变量各种不同的类型,举一个生活的例子:你在学生宿舍,你的朋友要找到你,只要他知道你的寝室号就可以很快的找到你,类比与计算机,每一个学生就是一个数据,这些数据存放在内存中(内存类比宿舍),而你可以通过地址来找到这个数据(地址类比寝室号)。概念:野指针就是指向的位置不可知,随机的,不确定的。
2024-05-21 11:08:54
776
3
原创 操作符详解
1.操作符的分类1.操作符的分类•算术操作符:•移位操作符:>•位操作符:& | ^ ~•赋值操作符:+=-=*=/=%==&=|=^=•单⽬操作符:!++--sizeof类型•关系操作符:>=一、算术操作符“+” “-”:和我们小学学的数学一样就是加和减的意思。“*” “/”
2024-04-29 19:58:16
699
原创 利用数组和函数怎么写一个热门扫雷游戏?
首先,我们就要有菜单,可以进入游戏,其次当我们开始玩游戏的时候要打印出棋盘,再者当我们点击一个格子要显示周围有几个雷,最后我们怎么判断游戏是否结束?如图,当我们开始游戏的时候,就显示左边的数据,在计算周围雷的个数就用右边的数组计算,那么当我们点击边缘上一点,该如何计算雷的个数呢?这个问题很简单,只要输入相应的坐标就可以了,例如上图,我们要输入‘1’的绿色格子,只要输入3 6就可以了。要知道因为我们的棋盘是扩大了一圈的,当我们填入雷的时候,为了避免填到外围我们还需要对填入的雷进行判断。1、屏幕上要显示菜单。
2024-04-24 22:51:14
580
3
原创 C语言的语言分支和循环语句
同理(3<4||5<3)在该式子中由于前面的(3<4)为真,而前面说了”||“中只要有一个为真即为真,所以此时计算机知道该式子必为真就不再进行后面的判断。(3>4&&5>3)在该式子中由于前面的(3>4)为假,而前面说了”&&“中只要有一个为假即为假,则此时,计算机知道该式子为假就不再进行后面的判断。一个表达式在进行前面的运算时,就已经得出该表达式是否为真,则该表达式将不再进行后面的计算。表达式1)若表达式1为真,则该式子为假,若表达式为假,则该式子为真。当表达式1成立则表达式2计算否者表达式3计算。
2024-04-11 22:16:36
850
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人