- 博客(40)
- 收藏
- 关注
原创 C++:动态内存管理(含五大内存分区区分)详解
/构造函数~List();int main()//自动调用构造函数,程序结束自动析构return 0;//总结:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会,new和malloc还有一个区别就是在申请内存失败时的处理情况不同,malloc如若开辟内存失败,会返回空指针,但是new失败会抛异常new的原理。
2025-03-27 10:30:00
798
原创 C++:类和对象(从底层编译开始)详解[前篇]
为了更清楚的明白类的定义与底层运行逻辑,我先从inline内联开始讲起:• ⽤inline修饰的函数叫做内联函数编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就不需要建立栈帧了,就可以提高效率//(1)为什么不需要建立栈帧• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地方不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定,inline适用于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数。
2025-03-14 22:37:26
880
1
原创 C++:入门详解(关于C与C++基本差别)
在函数定义时为参数指定的默认值,当调用函数时如果没有传递该参数,则使用默认值。这样可以提高函数的灵活性和可重用性举例例如一个计算面积的函数,参数有长和宽,其中宽可以设为默认值1,这样调用时只传长就可以得到正方形的面积,这样的例子比较直观//如果调用这个函数但是不传递参数,那么返回结果就是8,同样如果掺入参数1和2,那么返回结果就是3即重名函数可以通过识别传入的参数类型来自动选择相对应的函数int main()return 0;引用不是新定义一个变量,而是给已存在变量取了一个别名。
2025-03-09 11:03:08
1473
2
原创 数据结构:二叉树的链式结构及相关算法详解
但还有一点尤其需要注意:就是不同于层序遍历,我上面所说的三种遍历都属于深度优先遍历(DFS),而层序遍历却属于广度优先遍历,关于这两大类遍历的优劣我会在实现层序遍历后作详细介绍。
2025-02-28 22:37:00
979
原创 数据结构:二叉树的数组结构以及堆的实现详解
二叉树满足以下两个特点:1. 二叉树不存在度大于 2 的结点2. 二叉树的子树有左右之分,次序不能颠倒,因此⼆叉树是有序树1. 方向不同从子节点向根节点方向调整例如,插入新节点时,将其放在堆末尾,然后逐层与父节点比较并交换从父节点向叶子节点方向调整例如,删除根节点后,将末尾节点移到根位置,逐层与子节点比较并交换2. 应用场景不同向上调整:插入新元素:新元素被添加到堆的末尾,可能破坏堆性质,需向上调整节点值增大:在最大堆中,若某节点的值变大,可能需要向上调整向下调整。
2025-02-26 23:17:26
1257
原创 数据结构:贪吃蛇详解
初始化状态,假设蛇的长度是5蛇的每个节点的x坐标必须是2个倍数,否则可能会出现蛇的⼀个节点有一半出现在墙体中,另外⼀般在墙外的现象,坐标不好对齐。关于⻝物,就是在墙体内随机⽣成⼀个坐标(x坐标必须是2的倍数),坐标不能和蛇的⾝体重合,然 后打印★效果展示就像这个样子(当然蛇头和食物的坐标都是随机出现的,且不能发生重叠而且必须保证范围,即必须出现在墙体之内),下面咱来仔细说一下代码:)
2024-12-17 02:01:50
1258
1
原创 数据结构:Win32 API详解
简单来说,我们平常在使用的VS里运行起来的黑框程序其实就是控制台程序例如我们可以通过cmd命令控制控制台窗口的长度:比如设置控制台窗口的大小为30行 ,100列这个窗口的打开和使用也很简单:打开搜索栏输入cmd并且以管理员身份运行就可以int main()//system函数,用来执行系统命令//更改界面大小system("title 贪吃蛇");//修改调试界面的标题,但程序一旦结束,设置的名字也会随之恢复出厂设置//为了使标题一直处于一个被修改的状态,故要使程序一直处于运行的状态。
2024-12-14 16:18:11
1414
原创 数据结构:双向链表详解
1.双向链表的结构2.双向链表的使用(1)双向链表的初始化(2)双向链表的打印(3)双向链表的尾/头插和尾/头删(4)查找(5)指定位置插入(6)销毁双链表(7)补充3.双向链表与单链表的对比。
2024-12-12 15:26:22
1341
1
原创 数据结构:单链表详解
1.单链表的介绍2.单链表的使用(1)结点的头/尾部的插入和删除(2)对特定结点的查找(3)在指定位置之前/后插入和删除数据(4)销毁链表3.链表与顺序表的对比。
2024-12-10 23:39:43
1571
2
原创 数据结构:通讯录(顺序表的应用)的实现详解
,然后在这个顺序表结构体中我们就可以很明显的看到我们将这个顺序表结构体类型作用为一个已知的类型并且定义了一个数组arr作为顺序表结构体的一个组员,由此可知,一个。
2024-12-07 12:33:24
1226
1
原创 数据结构:顺序表详解
typedef struct //定义数据类型int size;}Seqlist;typedef struct //定义数据类型int size;}Seqlist;int size;// 有效数据个数// 空间容量}SL;//命名了一个数据类型为struct Seqlist的叫SL的顺序表二.顺序表的初始化与销毁以下是将初始化分装为函数并且在text.c里调用以便调试(接下来会有很多处这样的分装)
2024-12-05 14:58:01
1241
2
原创 C语言:预处理详解
预处理是指在C语言源代码被编译之前,由预处理程序对源代码进行的一系列处理过程。这些处理包括宏定义、文件包含和条件编译等,主要目的是为了提高代码的移植性和修改的方便性预处理的具体功能宏定义:通过#define指令定义宏,可以在程序中用特定的标识符代替一段代码,方便代码的重用和修改文件包含:使用#include指令将其他文件的内容插入到当前文件中,常用于包含头文件,提供函数声明和宏定义等条件编译。
2024-12-01 14:54:23
1334
原创 C语言:编译和链接详解
那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下翻译环境所 做的事情。其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编 译)、编译、汇编三个过程。
2024-12-01 09:51:20
416
原创 C语言:文件操作详解(2)
1.文件的随机读写(1)fseek(2)ftell(3)rewind2.sprintf和sscanf函数3.文件读取结束的判定(之被错误使用的feof)4.缓冲区。
2024-11-27 17:19:06
606
原创 C语言:文件操作详解(1)
(1)如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件(2)磁盘(硬盘)上的⽂件是⽂件, 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)程序文件:包扣源程序文件(后缀为.c),目标文件(windows环境后缀为.obj)和可执行程序(后缀为.exe)
2024-11-24 16:33:49
1133
原创 C语言:动态内存管理详解
1.malloc和free函数2.calloc和realloc函数3.动态内存管理的常见错误(1)对空指针的解引用操作(2)对动态开辟空间的越界访问(3)对非动态开辟内存使用free(4)使用free释放动态内存空间的一部分(5)对于同一块动态内存的多次释放(6)动态开辟内存忘记释放4.几道关于动态内存管理的经典例题5.柔性数组6.C语言里的内存区域划分(附录)但是对于空间的需求,不仅仅是上述的情况。
2024-11-22 22:23:32
1190
1
原创 C语言:自定义类型:联合和枚举
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间共⽤体。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。2.声明:如下:这个联合体算出的大小就是最大的那个类型的大小。
2024-11-22 10:43:33
615
原创 C语言:内存函数详解
这里其实还需要进行解释的一点是在从右开始拷贝的时候怎么找到src和dest的末尾,这里我们通过(char*)dest + num (char*)src + num 分别找到了dest和src的末尾,接着我们通过while循环,并且以num-- 作为循环判断条件,这时候随着num的变化,指向dest和src的指针也跟着移动,从右向左进行交换,当num为0时,交换完成,循环停止。既然这样话,我们可以以dest和src的位置来划定情况,当dest在src左边时从左开始拷贝,其他两种情况从右开始拷贝。
2024-11-20 18:12:44
1016
原创 C语言:字符函数和字符串函数详解
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都 是有对应的错误信息的。• 若源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
2024-11-15 18:43:03
1113
原创 C语言:深入理解指针(5)【刷题下篇】
指针运算的七道经典笔试题关键点:1. &a+1表示 跳过2. 第五行表示将 &a+1为int* 类型并且 赋值给 ptr3. *(a+1)表示对数组的 第二个元素 的地址故答案为:2,5注意:1.第二个和第三个的不同,一个是强转为而另外一个是2.x86环境下存入内存的需换算成16进制。
2024-11-14 11:29:44
457
原创 C语言:深入理解指针(4)【刷题上篇】
1.sizeof和strlen的区别2.数组和指针笔试题一.sizeof和strlen的区别1. sizeof和strlen的定义和用途sizeof 是一个操作符,用于计算变量或数据类型所占用的内存大小,单位是字节。它在编译时进行计算,不关注内存中存放什么数据 strlen 是一个库函数,用于计算字符串的长度,即统计'\0'之前的字符个数。它需要在运行时进行计算,关注内存中是否有'\0'字符。值得注意的是strlen()里存的是一个。
2024-11-14 00:46:01
361
原创 C语言:深入理解指针(3)
由于这些数据类型的大小不同(例如,int可能是4字节,float可能是4字节,char可能是1字节),直接进行整体交换可能会导致数据错误或越界。qsort函数是C语言标准库中的一个排序函数,基于快速排序算法实现,可以对任意类型的数据进行排序 , qsort函数定义在。:用户需要定义一个比较函数,该函数接受两个const void*类型的参数,并返回一 个整数,表示两个元素的大小关系。compare:一个比较函数指针,用于比较两个元素的大小,返回值为整数,表示两个元素的大小关系。
2024-11-10 12:51:59
609
原创 C语言:深入理解指针(2)
我们知道:•整形指针变量: int * pint;存放的是整形变量的地址,能够指向整形数据的指针。• 浮点型指针变量: float * pf;存放浮点型变量的地址,能够指向浮点型数据的指针。
2024-11-09 15:54:48
774
原创 C语言:深入理解指针(1)
假如你一个人去旅游,然后进入酒店夜宿,而这时候你要去找他,如果你的朋友没有告诉他的房间,这时候你就要一个一个房间找,这就显得很麻烦。此时假如你的朋友告诉他的房间,这时候你就可以快速找到他所在房间,这样是不是节省了很多时间。此时我们可以把指针理解为酒店的房间号。
2024-11-08 10:33:38
962
原创 C语言:arr与&arr
arr表示整个数组的起始地址,而arr[0]表示整个数组的起始地址的第一个元素。例如,&arr+1会跳过整个数组的长度(例如10个整数),而arr+1只会跳过一个整数的大小(例如4字节),即数组第一个元素的地址。在大多数情况下,数组名可以被当作一个指向其第一个元素的指针。例如,arr和&arr是等价的,都表示数组第一个元素的地址。(+1*sizeof(int))字节,后面的却是加了40(+数组长度10*sizeof(int))字节,就是直接跳过了这个数组,也说明了。,表示数组的第一个元素。
2024-11-08 09:15:37
825
原创 C语言:操作符详解(上)
1.操作符的分类 2.移位操作符3.位操作符4.单目操作符5.逗号表达式6.下标访问,函数调用操作符7.结构体成员访问操作符 移位规则:左边抛弃,右边补0如上,则是对15的左移(这里涉及到的进制转化和源码,反码,补码请参考详解操作符(二))移位规则:2.2.1 逻辑右移:左边用0填充,右边丢弃 2.2.2 算数右移:左边用该值的符号位填充,右弃注:上述两种运算方式,在C语言中并没有详细敲定,但一般
2024-11-07 19:58:21
1307
原创 C语言:扫雷详解
预计效果和作用:将扫雷游戏分为里外两个棋盘, 里面方便自己辨别使用以及后续的调用(将棋盘内的所有座标处定义为字符0) 外面给别人看,全部设置为字符*ps:这个函数需要四个参数,初始化数组(棋盘)时的行和列,数组本身,以及放在棋盘里的初始字符1.1 看到这里,大家可能有点疑惑我代码里的ROWS,COLS,row,col究竟为何物,说简单些,前两者是由我主动定义的两个量,即(这里要注意我这些定义最好就在.h为后缀的头文件里实现)而我定义这些量的原因就是取决于我在打造这个9*
2024-11-05 09:24:20
1013
原创 C语言:猜数字游戏
再看接下来,由于srand默认返回的是unsigned类型的值,而time函数返回的是time_t类型,因此要使srand控制的种子不停变化(也就是随时间而变化时),必须将这两个函数统一到同一个数据类型,也就是通过使用。printf("------ 1. 玩游戏 ------\n");printf("------ 0. 退出游戏 -----\n");printf("猜小了\n");
2024-10-20 14:40:52
1001
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人