自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 C++内存管理

1.调用operator new函数来申请空间。2. 在申请的空间上执行构造函数,完成对象的构造。

2025-05-07 19:18:54 602

原创 C++类与对象基础续

2.内部类默认是外部类的友元类。3.内部类本质也是一种封装,当A类与B类紧密关联时,A类实现出来主要就是为了给B类使用,那么可以考虑把A类设计为B类的内部类,如果把A类放到private / protected位置,那么A类就是B类的专属内部类,其它地方就都用不了了。内部类这个东西,C++中用的还是比较少的。

2025-05-06 20:59:26 944

原创 C++类与对象基础

目录1.取地址运算符重载 2.初始化列表3.类型转换既前面所讲的C++类与对象知识,C++类与对象——基础知识-CSDN博客C++类与对象——构造函数与析构函数-CSDN博客C++类与对象——拷贝构造与运算符重载_c++拷贝对象和对象调用同一函数的输出区别怎么实现-CSDN博客本章我们将继续学习类与对象的基础知识。首先是最后的两个默认成员函数:取地址运算符重载和const取地址运算符重载在这之前,我们先看一下const的知识。const修饰的成员函数叫做const成员函数,const放到成员函数列表的后面.

2025-04-29 21:02:31 1026

原创 C++类与对象——拷贝构造与运算符重载

拷贝构造函数和赋值运算符重载就是C++类默认六个函数之二。

2025-03-15 21:27:07 881 1

原创 C++类与对象——构造函数与析构函数

⼀个类,我们不写的情况下编译器会默认⽣成6个默认成员函数。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并 不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,比如局部对象是存在栈帧的, 函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调用析构函数,完成对象中资源的清理释放工作。

2025-03-13 16:26:46 652

原创 C++类与对象——基础知识

(inline)。当然,具体展不展开由编译器说了算。类有三个。

2025-03-13 15:42:22 887

原创 数据结构——堆

对于一个节点,我们判断其节点值与左右节点的值相比较,如果当前节点的值不满足都小于或等于其左右孩子结点的值, 那么我们将节点与左右节点中较小的那个进行交换操作,由于进行了交换,故当前这棵子树中满足了小顶堆的特点,但由于交换了位置,故需要判断被交换位置后的子树位置此时的节点与其新左右孩子的节点值是否满足小顶堆。源文件 heap.c。1.下沉操作down。

2025-03-11 21:27:07 397

原创 数据结构——树,二叉树

树是⼀种非线性的数据结构,它是由 n(n>=0)个有限结点组成⼀个具有层次关系的集合。树中有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每⼀个集合 Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以 有 0 个或多个后继。因此,树是递归定义的。树形结构中,子树之间不能有交集,否则就不是树形结构。:若⼀个结点含有⼦结点,则这个结点称为其⼦结点的⽗结点;

2025-03-10 22:05:14 1115

原创 C++初阶——入门基础2

因为inline被展开,就没有函数地址,链接时会出现报错。声明和定义分离到两个文件的好处有就是可以防止链接错误,因为如果把声明和定义写在一个头文件中,当在其它多个文件中要使用这个函数时,会包含这个文件,然后在预处理阶段展开头文件,这样每个文件中就都有了这个函数的符号表,在链接阶段就会发生错误。关于编译链接的知识点下面。

2025-03-04 20:49:43 607

原创 C++初阶——入门基础1

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量生命周期。• namespace只能定义在全局,当然他还可以嵌套定义。

2025-03-03 17:20:21 505

原创 数据结构——队列

队列:只允许在⼀端进行插⼊数据操作,在另⼀端进行删除数据操作的特殊线性表,队列具有⼊队列:进行插入操作的⼀端称为队尾出队列:进行删除操作的⼀端称为队头。

2025-03-01 08:49:21 299

原创 数据结构——栈

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作 的⼀端称为栈顶,另⼀端称为栈底。栈是一种比较简单的数据结构,就是一种特殊的线性表,用数组来实现比较简单。LIFO(Last In First Out)的原则。压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。出栈:栈的删除操作叫做出栈。源文件 stack.c。

2025-02-27 14:38:07 279

原创 位运算的运用饱和加法函数实现

所以可以要想办法构造两个掩码,一个标记正溢出,一个标记负溢出,掩码是全1或者全0,这样与INT_MAX,INT_MIN 按位与之后就可以要么不变,要么变为0,再加上未溢出的情况,就有三个结果,它们要么是不变要么是0,把这三个数按位或上就可以得到最终答案。同正常的补码加法溢出的方式不同,当正溢出时,饱和加法返回 TMax,负溢出时,返回 TMin。溢出标志(正溢出为例):(x_sign == 0) && (y_sign == 0) && (sum_sign == -1)得到的结果要么是1,要么是0。

2025-02-27 14:05:41 368

原创 数据结构——链表

链表是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的性质:1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续2、结点⼀般是从堆上申请的3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续链表可分为带头,不带头;单向,双向;循环,不循环。各种组合一共有8种;一般常用的就是单链表,和双向带头循环链表。带头只需要加一个指向第一个节点的哨兵位就行了,循环只需要最后一个节点的next指针指向头节点。

2025-02-26 17:19:56 273

原创 数据结构——静态顺序表,动态顺序表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性 表在物理上存储时,通常以数组和链式结构的形式存储。以数组形式存储的线性表又叫做顺序表,以链式结构存储的又叫做链表顺序表又分为静态顺序表,和动态顺序表;

2025-02-24 22:48:14 445

原创 C语言——offsetof宏的原理

而我们求偏移量时就是相对于0偏移量处求的,所以得到的地址就是偏移量,只要转换成整形就行了。因为(s*)0 就相当于在0地址处开始存储结构体,所以m的地址就是相对于0地址的。此时无法打印任何内容,因为0地址就相当于NULL,对NULL指针的使用是非法的。再让奇数位变成偶数位,偶数位变成奇数位,就只需要,奇数位左移一位,偶数位右移一位。要让奇数位保留,就让奇数位与上1,偶数位与上0,得到偶数位就正好相反。我么能否写一个宏将一个整数的二进制位的奇数位和偶数位交换。我们逐个分析,首先,s是结构体,m是结构体成员,

2024-12-01 17:06:36 462

原创 C语言程序的编译和链接

经过预处理后的 .i ⽂件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到 .i ⽂件中。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的 .i ⽂件来确认。

2024-12-01 10:55:00 1102

原创 C语言——文件操作

程序文件,数据文件程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。这样的文件就是数据文件。一般的我们处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显示到显示器上。这也称为标准输入输出。

2024-11-30 20:10:06 1283

原创 C语言中的字符函数<ctype.h>

函数功能这些函数接受一个待测试的字符作为参数。注意,intchar,因为它们允许作为参数。如果参数字符属于指定类型,就返回一个非零整数(通常是1,表示为真),否则返回0(表示为伪)图中函数就是用来判断字符是否是大写字母、小写字母、数字字符或其他字符。这些函数用法都比较简单且相似,可以自己去尝试。

2024-11-24 10:02:42 406

原创 C语言自定义类型——结构体、联合体、枚举

跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

2024-11-23 20:11:21 1639

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

IEEE 754规定: 对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字 M(这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。这时,浮点数就采⽤下⾯的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效 数字M(

2024-11-22 17:04:37 683

原创 C语言内存函数

同样的,第一个是目的地,第二个是源头,第三个参数是void* 的原因是可以接收任何类型的地址memcpy函数(内存拷贝)从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。虽然上面的拷贝没什么问题,但是尽量还是不要用memcpy来拷贝有重叠的数据。有重叠时使用下面的memmove模拟实现memcpy(不支持内存重叠的拷贝)

2024-11-21 17:10:17 476

原创 C语言字符串函数2

求字符串长度,统计\0之前的字符个数为什么是33呢?因为"yzkkk"已经有5个了,,值就是随机的。

2024-11-21 11:31:53 1100

原创 C语言字符串函数1

参数是两个字符指针,返回值是 int ,strcmp 逐个比较两个字符串的ASCII码,第一个字符串的字符ASCII码大于第二个时返回大于0的数,等于时返回0,小于时返回小于0的数在VS2022中,返回值为1,0,-1这三种strcmp的一种模拟实现如下。

2024-11-19 21:07:26 845

原创 C语言——使用冒泡排序模拟实现qsort函数

先看cmp函数,要保证cmp函数与qsort函数中的函数指针类型相同,返回int,参数是两个const void*,cmp函数要根据具体比较的数据类型进行分析,而且因为时void*,所以使用时要先强制类型转换为其他指针,再解引用。主要还是看swap函数,swap函数用来交换两个数据,由于我们不知道数据的类型,所以进行一个字节一个字节的交换。my_qsort函数内部冒泡排序的整体思路不变,重点是cmp函数和swap函数。使用这个函数时要注意,先把base强制类型转换为char*。n就是每个元素的字节数。

2024-11-14 15:02:35 360

原创 C语言——深入理解指针5

typedef 是用来类型重命名的,可以将复杂的类型简单化⽐如,你觉得 unsigned int 写起来不⽅便,如果能写成 uint 就⽅便多了,那么我们可以使⽤但是对于数组指针和函数指针稍微有点区别新的类型名必须放在括号里*的右边。使用重命名,可以是一些复杂的代码更加易读,如下面的代码初看可能都懵了使用上面的typedef后就变成了它的参数是int 和 void(*)(int)函数指针,返回值类型也是void(*)(int)函数指针。

2024-11-14 14:51:45 649

原创 C语言——深入理解指针4

字符指针:char*如图,这是一般使用方法,但还有另一种使用方法,如下图:而从监视窗口中可以知道,s还是字符指针,指向字符i。所以字符数组可以用来表示字符串,但它存储的还是第一个字符的地址,通过它可以访问一个字符串。那么,字符数组与字符指针表示字符串有什么区别吗?可以看到,,而字符指针却不行。这是因为字符指针存放的是字符串常量,虽然也是在一块连续空间存放多个字符,但上面图中的结果是str1与str2是不同的,str3与str4是相同的。因为str1, str2是数组名,比较的就是。

2024-11-10 22:04:53 625

原创 C语言——深入理解指针3

指针变量也是变量,是变量就有地址,而指针变量存放的位置就是二级指针可以看到,ppa中存放的正是p的地址,*ppa是对ppa解引用,就是对p进行操作,**ppa先解引用得到p在对p解引用得到a。既然有二级指针,肯定有三级,四级……等指针,不过一般不会超过三级指针,不然人的转晕了,就和数组一样。

2024-11-10 20:36:59 674

原创 C语言实现冒泡排序

框出来的部分就是相对于初始的冒泡排序优化的地方,增加了flag来判断数组是否有序,当某一趟下来一次都没有交换时,那么就说明此时数组就已经有序了,不需要继续去排序了,就让它直接跳出循环。因为如果一个数组是基本有序的,原本的冒泡排序还是要遍历每一次,时间复杂度就很大了,所以在其中增加对于数组是否有序的检查,有序后就可以直接跳出循环了。因为每一次比较,右边的数都会大于等于左边的数,不断地取大,最右边的数就变成最大的数了;在每一趟排序中,都会把最大的元素放在最后面。

2024-11-09 21:06:44 361

原创 C语言——深入理解指针2

⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

2024-11-09 20:41:03 406

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

然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。如果程序⼜出现问题,可以移 除这条 #define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启⽤了 assert() 语 句。此时就没有断言了,一定要注意是在assert.h头文件前面,不然是无法关闭assert的当然assert也有。

2024-11-09 17:40:39 989

原创 C语言:初步理解指针

指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各 种各样的指针类型呢?可以看出,int*类型的指针改变了n的四个字节。当pi为char*类型的指针是,只是将n的第一个字节改变为了0。。⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

2024-11-08 21:21:45 382

原创 C语言:初识指针

内存单元的编号 == 地址 == 指针计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那这些内存空间如何⾼效的管理呢?其实是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。计算机中的单位有bit(比特)、byte(字节)、KB、MB、GB、TB、PB。⼀个⽐特位可以存储⼀个2进制的位1或者0。每个内存单元,相当于⼀个学⽣宿舍,⼀个字节空间⾥⾯能放8个⽐特位,就好⽐同学们住 的⼋⼈间,每个⼈是⼀个⽐特位。

2024-11-08 20:52:58 474

原创 C语言中的位运算

移位有左移和右移即<<、>>,移位运算都是争对整数,移动的是二进制的位。左移的原则是左边抛弃,右边补0,所以左移一位就是乘2!!!如下图所示而右移的原则是左边用该值的符号位填充,右边抛弃,所以右移就是除以2!!!,但要注意的是这里是整数除法!如下图所示当然也可以使用补码来计算通过补码运算结果为-3.

2024-11-02 21:09:11 539

原创 整数的二进制表示——原码、反码、补码

负数的原码的符号位不变,数值位取反就得到反码,再加一就得到补码。补码再转化为原码也是一样的过程。存储在计算机中的就是补码,也是通过补码来运算,这样就能变减法为加法。的三个码都由符号位和数值位组成,无符号整数没有符号位。有符号数符号位是1就是负数,符号位是0就是正数。上面的例子就是1+(-1)的补码运算。正数的三个码都相同,负数就不同了。

2024-11-02 20:35:57 189

原创 转义字符详解

一般在连续书写多个问号时使用,防止被解析为三字母词,现在的编译器已经无法再验证了,\\、\'、\"都是同一个用法,为了防止单独的一个\ ' " 被错误解析。如图,长度为16,\382,因为有8,所以不是八进制,\3是一个八进制,相当于\003;VS已经用颜色区分开了来提示我们。\0一般在字符串的末尾都会默认加上,用于判断字符串的结束位置,sizeof求有多少个字节,一个字符占一个字节,而strlen求字符串的长度,\0之前的长度。\t就是Tab键,它的效果是跳到下一个tab位置,以每8个长度为基准。

2024-11-02 20:19:40 451

原创 使用C语言实现简易的扫雷游戏

这样的棋盘,可以用一个二维数组来存储,用0代表无雷,1代表有雷。但会有一个问题,排查雷时,如果雷的个数是1,那么这个1就和雷的1冲突了。参数与上面一样,通过生成随机数来随机生成雷,要注意可能会同一个位置重复生成雷,要排除这种情况。:参数有,数组,行数,列数。接下来又有一个问题,如果排查边界上的雷时,数组会越界,所以就再加上两行和两列,构造11*11的棋盘。确定参数有,数组,行数,列数,以及初始化为哪个字符,再通过循环来实现。初始化棋盘,打印棋盘,布置雷,排查雷,计算周围雷的个数;接下来,我们要做一个。

2024-10-25 20:54:56 503

原创 C语言中scanf用法总结

VS2022中使用的编译器是msvc,scanf本身是不安全的,因为你输入的变量个数可能比要输入的个数多,所以在VS2022中提供的解决方法是使用scanf_s函数或者使用。第一个读取%d,那么就读到小数点为止,就是-13,接着从小数点继续向后读直到#,就是 .43e6(科学计数法)。先打印43,43是两个字,所以再打印2,2是一个,所以再打印1,就是4321了。因为一开始就读到了a,没有读取到任何项,所以返回0(?,可以跳过有效字符前的空格,不然会读取到空格,因为空格也是字符。

2024-10-25 12:28:51 892

原创 C语言字符加减

如图,变量a是字符1,通过%c来打印时1,而通过%d来打印是49,是因为%d打印的是a的ASCII码,常见字符ASCII码如下。C语言中字符类型是用char来表示,char属于整形家族,char类型实际上是存储ASCII码,其中第一列是十进制,第二列是八进制,第三列是十六进制。如图,字符1加字符2,结果是字符c,相乘也是如此。字符的加减乘也是计算的ASCII码值。

2024-10-24 22:18:14 845

原创 C语言中printf用法总结

ld、%lld:分别表示long、long long;%u、%lu、%llu:分别表示unsigned int、unsigned long、unsigned long long;可以看到,加上正负号并不影响这个数本身,加上正号,可以使正数显示正号,对负数无影响,加上负号,没有用,也就相当于不加。printf对正数不显示‘+’,只对负数显示‘-’,如果想要显示正负号,可以在%后面加上正负号;补充:一般的话,如果位数不够时用空格来填充,如果加上一个0,就可以用0来填充,如上面的%05d。

2024-10-19 17:13:37 631

空空如也

空空如也

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

TA关注的人

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