- 博客(31)
- 收藏
- 关注
原创 C/C++内存管理&函数模板
内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[ ]中指定对象个数即可。new申请空间+调用构造函数初始化。
2025-08-10 21:13:24
894
原创 C++入门学习5
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。初始化列表的核心是 “初始化”,必须遵循 “每个成员仅初始化一次” 的规则,重复初始化会报错。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。属于类 A 本身,而非某个对象,所有 A 类型对象共享这一个变量,适合用于记录类的对象总数。2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
2025-08-10 17:35:53
634
原创 C++入门学习4
这里会出现:s1对象调用构造函数创建,在构造函数中,默认申请了10个元素的空间然后里面存了4个元素1 2 3 4,然后s2对象使用s1拷贝构造,而Stack类没有显式定义拷贝构造函数,则编译器会给Stack类生成一份默认的拷贝构造函数,默认拷贝构造函数是按照值拷贝的,即将s1中内容原封不动的拷贝到s2中。s2先销毁,s2销毁时调用析构函数,已经3将0x11223344的空间释放了,但是s1并不知道,到s1销毁时,会将0x11223344的空间再释放一次,一块内存空间多次释放,肯定会造成程序崩溃。
2025-08-10 11:59:14
983
原创 C++入门学习3
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。5. class的默认访问权限为private,struct为public(因为struct要兼容C)如下:struct的函数都是公有的,class从{开始到public之前的函数都是私有的。)下图A类先创建两个对象接着B类创建两个对象,main函数结束时,先调用B类对象的析构函数在调用A类对象的析构函数。如下面这个日期类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?
2025-08-09 20:42:16
1083
原创 C++入门学习2
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。如函数定义在.cpp文件,inline函数声明在.h文件,在测试文件调用函数,则会报错。1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。
2025-08-09 15:11:56
1017
原创 C++入门学习
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。使用namespace关键字定义属于我们自己的命名空间:namespace关键字后面加上命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分。
2025-08-07 21:41:20
1111
原创 归并排序递归法和非递归法的简单简单介绍
归并排序是一种基于分治思想的有效排序算法,其核心是通过递归将数组不断二分直至单个元素,然后按顺序合并有序子序列。算法分为递归和非递归两种实现方式:递归法通过_MergeSort函数划分区间并调用自身,然后将有序子序列合并到临时数组后回写;非递归法使用MergeSortNonR函数,通过gap变量控制合并步长,逐步扩大有序区间。两种方法都使用MergeArry函数进行具体合并操作,时间复杂度均为O(N*logN),空间复杂度为O(N)。代码示例展示了完整的实现过程,包括边界处理和数据拷贝等关键步骤。
2025-07-13 17:10:48
370
原创 快速排序递归和非递归方法的简单介绍
摘要:快速排序是一种基于分治思想的高效排序算法,其核心是通过基准值将数组划分为左右两部分,递归处理直至有序。本文详细介绍了三种单趟排序实现方法:1)左右指针法通过双指针交换元素;2)挖坑法通过移动基准值"坑位";3)前后指针法利用双指针交替移动。针对递归可能导致的栈溢出问题,提出三数取中优化基准值选择,并建议小规模数据使用插入排序。最后介绍了用栈模拟递归的非递归实现,有效避免深度递归风险。各种方法均附有代码实现和图示说明,完整展现了快速排序的优化思路。
2025-07-12 22:10:00
605
原创 希尔排序和选择排序及计数排序的简单介绍
在元素集合arr[i]--arr[n-1]中选择最大(小)的数据 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。当begin和maxi重叠时,mini位置的数据和begin位置的数据互换后要将mini的值给到maxi,在将maxi位置的数据和end位置的数据互换。然后遍历数组,将数据出现的次数放到temp数组。
2025-07-12 18:10:42
520
原创 二叉树的简单介绍
树是一种非线性数据结构,由节点构成层次结构,形似倒挂的树。主要特性包括:根节点无前驱,子树互不相交,具有递归定义。二叉树是特殊的树结构,每个节点最多有两个子节点(左/右子树),具有有序性。文章介绍了树的基本术语(如度、深度、叶子节点等)、存储结构(顺序/链式),并重点讲解了二叉树的构建、遍历(前序/中序/后序)以及计算节点数、叶子节点数和深度的方法。通过C语言代码示例演示了二叉树的实现和递归遍历过程,帮助理解树结构的特性与应用。
2025-07-05 17:46:18
1383
原创 堆的简单介绍
本文介绍了完全二叉树和堆的概念及其实现。完全二叉树是效率很高的数据结构,其每个节点都与满二叉树对应。堆使用数组存储,实现父子节点间的下标关系。文章详细讲解了堆的实现过程,包括初始化、插入、删除、调整等核心操作,重点分析了向下调整算法(要求左右子树已满足堆性质)和向上调整算法(用于插入操作)。同时提供了堆排序的实现思路,通过不断调整堆结构实现数据有序排列。代码示例展示了堆的各种操作及测试流程,包括堆的构建、插入元素、删除堆顶等。
2025-07-05 11:42:41
468
原创 插入排序的简单介绍
摘要:插入排序是一种简单排序算法,其核心思想是将未排序元素逐个插入到已排序序列的正确位置。算法实现时,首先将第一个元素视为有序序列,然后依次将后续元素(temp)与已排序元素从后往前比较,若temp较小则后移已排序元素,直至找到合适位置插入。文中给出了单趟排序的实现代码和完整插入排序函数,并通过测试用例验证了算法的正确性,成功将无序数组{3,1,4,2,8,4,9,6,0,7}排序为升序序列。
2025-06-30 22:11:47
557
原创 双链表的简单介绍
本文详细介绍了带头双向循环链表(简称双链表)的实现原理与操作方法。文章首先分析了8种可能的链表结构组合,重点说明双链表采用带头(哨兵位)、双向、循环的结构特点。随后通过List.h头文件定义了链表节点结构和操作接口,在List.c中实现了包括初始化、销毁、插入(尾插/头插/指定位置插入)、删除(尾删/头删/指定位置删除)、查找等核心功能。实现过程中特别强调了指针操作的顺序性和内存管理注意事项,并提供了测试用例(test.c)验证功能。这种链表结构通过哨兵节点解决了循环链表遍历时的死循环问题,具有高效的前后向
2025-06-24 19:15:00
1811
原创 队的简单介绍
本文介绍了队列数据结构的基本概念和链式实现方法。队列是一种先进先出(FIFO)的线性表,支持在队尾插入(入队)和队头删除(出队)操作。文章详细阐述了用单链表实现队列的优势,相比数组实现避免了数据搬移的开销。代码实现包含队列初始化、销毁、入队、出队等核心操作,以及获取队头队尾元素、队列大小和判空等辅助功能。测试用例展示了队列的基本使用方法。整个实现通过头指针和尾指针管理队列,出队时执行头删操作,入队时执行尾插操作,确保了操作的高效性。
2025-06-23 19:00:00
478
原创 栈的简单介绍
栈的概念与实现 栈是一种遵循后进先出(LIFO)原则的线性表,仅允许在栈顶进行插入(压栈)和删除(出栈)操作。实现方式包括数组和链表,数组更优因尾插效率更高。动态栈通过动态扩容(realloc)支持增长,包含初始化、销毁、压栈、出栈等操作。测试示例展示了栈的基本使用:压入数据1-4后,循环出栈并打印栈顶元素(输出4 3 2 1)。关键点包括以栈顶指针_top管理操作,通过断言保证操作合法性,以及扩容时的地址安全处理。
2025-06-22 08:00:00
509
原创 顺序表的介绍
摘要:本文详细介绍了线性表数据结构中的动态顺序表实现。主要内容包括:1) 线性表的基本概念与分类;2) 动态顺序表的结构设计(包含数据指针、当前元素个数和容量);3) 关键功能实现:初始化、销毁、头插/尾插、头删/尾删、指定位置插入/删除、查找等操作;4) 动态扩容机制及内存管理注意事项;5) 测试用例演示。重点阐述了动态顺序表通过指针实现动态内存分配的优势,避免了静态顺序表空间浪费的问题,并提供了完整代码实现方案。
2025-06-21 11:26:32
1056
原创 单链表的介绍
相当于链表的头或者火车的头。在尾插中,也需要接收指向头节点的指针的地址,因为链表有可能是空链表,此时plist就要指向新的节点。答:链表中每个节点都是独立申请的(即需要插入数据时才去申请⼀块节点的空间,这里使用了动态申请内存的函数,下次讲),我们需要通过指针变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。下面这张图就是一个节点,节点目前存储的是数字1(车厢),0x0012FFA0为下一个节点的地址(下一节车厢的钥匙),0x0012FFB0为这个节点的地址,由它上一个节点的指针保存。
2025-06-10 20:50:56
799
原创 扫雷游戏(基础版)
为了方便存储布雷的信息和排除雷为后面参考,我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数是1 假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下面的三 个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。
2025-06-02 16:11:26
482
原创 #define宏&#和##的对比&条件编译&头文件
比如,写⼀个函数求2个数的较大值的时候,不同的数据类型就得写不同的函数。当宏参数在宏的定义中出现超过⼀次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。乘法运算先于宏定义的加法,所以出现了 55 .这个问题,的解决办法是在宏定义表达式两边加上⼀对括号就可以了。如果是,它们首先被替换。参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的⼀部分。2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
2025-06-01 20:25:29
928
原创 文件&文件的各种操作
每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信 息,使用者不必关心细节。
2025-05-31 13:43:43
888
原创 介绍结构体--内存对齐--传参
原因: 函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递⼀个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构 体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。3.结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的 整数倍。2.从第2个成员变量开始,都要对齐到某个对齐数的整数倍的地址处。
2025-05-26 22:06:02
316
原创 整数和浮点数在内存中存储
比如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。整数的2进制表⽰⽅法有三种,即:原码、反码和补码 有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是⽤0表示“正”,⽤1表示“负”,最高位的⼀位是被当做符号位,剩余的都是数值位。IEEE754规定:对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字 M。对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效 数字M。
2025-05-26 20:33:11
718
原创 学习字符函数strlen&模拟实现strlen,strlen和sizeof的对比
函数参数是字符串/数组的首元素的地址,被const修饰意味着不能通过(*str)解引用指针修改所传入的字符串的具体元素。第二个3是3个字节arr1中只有3个char类型的元素,一个char类型占1个字节。4是4个字节的意思,其中3个字节arr1中只有3个char类型的元素(abc),还有一个字节是\0。注意:strlen函数返的是字符串结束标志:“\0”,之前的字符的个数;如果没有所定义的字符串没有结束标志,那么strlen一直寻找,直到找到字符串结束标志:“\0”,为止。(可能会越界访问)(情况1,2)
2025-05-26 16:33:22
1000
原创 函数指针&函数指针数组&实现一个简单的计算器功能
int (*pfarr[4])(int, int) = { add,sub,mul,div }就是在函数指针的基础上加入:[元素个数],[ ]的优先级比*高,pfarr先和 [4] 结合,形成一个包含 4 个元素的数组;那么他们的函数指针的类型也是一样的:int (*)(int , int );如果想加入新的计算函数如:取余数,按位与,按位或等,直接写好函数,把函数名字加入到函数指针数组在调整判断即可。我们发现这四个函数的类型是一样的,这时就可以利用上面提到的函数指针数组来管理这4个函数。
2025-05-12 11:13:54
667
原创 简单介绍指针&利用指针写一个反转字符串的函数
他们之间的关系:1Byte = 8bit ,1KB = 1024Byte ,1MB = 1024KB ,1GB = 1024MB ,1TB = 1024GB ……假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房⼦去找,这样效率很低,,相当于⼀个学⽣宿舍,⼀ 个字节空间⾥⾯能放8个⽐特位,就好⽐同学们住 的⼋⼈间,每个⼈是⼀个⽐特位。计算机的内存单位:bit - ⽐特位, Byte - 字节 ,KB, MB, GB, TB……
2025-05-01 11:34:59
343
原创 打印整数二进制序列的偶数位和奇数位
思路:所以,要打印整数二进制序列的偶数位和奇数位,可以让这个正数按位或1:num & 1;然后再移动正数num的二进制位,打印下一个位置的0或1。介绍按位与操作符:&
2025-04-27 16:53:49
167
原创 利用C语言打印一个菱形
第二部分的思路:同样利用一个for循环倒序产生1-6的数字控制行号;进一步拆解,第8行中需要打印1个空格和11个 *号,第9行中要打印打印2个空格和9个 *号,第三行中要打印打印3个空格和7个 *号,……第一部分的思路:利用一个for循环产生1-7的数字控制行号……再内嵌两个for循环控制列号,其中一个for循环打印空格,另外一个for训话打印 * 号……进一步拆解,第一行中需要打印6个空格和1个 *号,第二行中要打印打印5个空格和3个 *号,第三行中要打印打印4个空格和5个 *号,。
2025-04-23 17:24:01
138
原创 简单函数介绍&随机数的生成&C语言编写猜数字游戏
直接调用rand函数它的种子是固定的,或者rand(2),给rand函数传一个大小为2的种子,多次执行后的结果依然是一样的。C语⾔提供了⼀个函数叫:rand,这函数是可以⽣成随机数的,rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。1.库函数:C语⾔的国际标准ANSI C规定了⼀ 些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语⾔标准就给出了⼀系列 函数的实现。
2025-04-19 11:09:33
800
原创 简单介绍for循环及利用for循环求100至200之间的素数
if (i == 5) // 当i==5时,执行continue,跳过printf("%d ", i);if (i % j == 0) // 当i被j整除时,i不是素数,则假设不成立flag改为0,同时跳出本次循环,i++判断下一个i。if (i % j == 0) // 当i被j整除时,i不是素数,则假设不成立改为0,同时跳出本次循环,i++判断下一个i。// 运行到这里有两种情况:1.i被整除,break打破循环,此时j<i;if (i == 5) // 当i==5时,执行break,循环结束。
2025-04-13 17:20:30
821
原创 第一篇博客(flag)
我是海南大学研二学生,目前正在努力学习C语言,并希望朝这个方向发展。虽然我以前对编程不太熟悉,但现在我每天都把全部时间投入到编程学习中,力求尽快掌握核心技能,为未来的职业发展做好准备。
2025-04-01 16:26:11
304
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人