
C/C++深度解析
文章平均质量分 88
讲解C/C++学习方向的难点以及要点
Undoom
个人网站:https://deepseek.hyk52syx.club/
阿里云开发者社区专家博主,华为云享专家 ,腾讯云创作之星,支付宝开发者社区优秀季度创作博主,支付宝社区问答官,阿里云社区问答官,腾讯云TDP -先锋会员,华为云初级校园大使,腾讯云TDP-产品KOL,极星会KOL,2024博客之星NO.20
展开
-
【C++AVL树】枝叶间的旋律:AVL树的和谐之道
公主请阅。原创 2024-12-09 07:58:58 · 2412 阅读 · 123 评论 -
【C++二叉搜索树】树语静谧:探寻二叉搜索树的内在秩序
公主请阅。原创 2024-12-06 14:07:49 · 2502 阅读 · 113 评论 -
C++继承---追寻父类的影子,走过代码的长夜
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。单继承:一个派生类只有一个直接基类时称这个继承关系为单继承多继承:一个派生类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前面,后面继承的基类在后面,派生类成员在放到最后面。当然有多继承语法支持,就一定存在会设计出菱形继承,像Java是不支持多继承的,就避开了菱形继承。原创 2024-12-03 09:50:38 · 1380 阅读 · 125 评论 -
C++ Stack和Queue---单向守护与无尽等待:数据结构的诗意表达
容器适配器(Container Adapter)是C++标准模板库(STL)中的一种设计模式,专门用于提供一种经过简化和限制的接口,使得不同的容器类型可以表现出类似的行为。容器适配器不会创建新的容器,而是基于已有的容器(如。编译器会生成一个 stack 的具体实例,并将代码中所有的 T 替换为 int,Container 替换为 std::vector。在需要高效的双端插入和删除操作时非常有用,但在需要频繁的中间操作或更高的随机访问性能时,它的效率可能不如。原创 2024-11-19 10:01:58 · 3534 阅读 · 142 评论 -
【C++ map和set】数据的吟游诗:Map与Set的双城记
setset的声明如下,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。原创 2024-12-05 10:26:48 · 2299 阅读 · 101 评论 -
C++模版进阶:为代码筑梦,为逻辑痴狂
分离编译可以帮助解决这些问题,但在C++中实现分离编译的难度较大,因为C++模板的编译方式与普通函数和类不同。函数模板特化(Function Template Specialization)是C++中的一种特化模板的方式,它允许我们为特定的数据类型实现一个与通用模板不同的版本,从而进行优化或满足特殊需求。可以声明但不定义模板实例化,允许分离编译,减少重复实例化,但这并非标准化的做法,依赖于编译器的支持。:模板是在使用时(而非声明时)进行实例化的,编译器需要知道模板的具体类型,以便生成实际代码。原创 2024-11-21 19:09:45 · 2873 阅读 · 133 评论 -
String的长度有限,而我对你的思念却无限延伸
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。而且如果我们需要进行推导的话,那么我们的右边就必须要有一个值,不然是不能进行推导操作的,因为我们不知道类型是啥,推导不出来,就会报错。如果新大小比当前大小大,新增的元素会使用默认值进行填充;因为我们的s2是拷贝s1的const对象,那么我们后面的begin()也是调用的是const的版本的。原创 2024-10-30 10:37:47 · 1519 阅读 · 129 评论 -
C++之二叉搜索树:高效与美的极致平衡
初始化完成之后我们进行一个判断,乳沟我们的parent的左节点是最小的节点的话,我们就让我们的parent的左节节点变成最小节点的右节点,否则的话就是parent的右节点变成最小节点的右节点。3.如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插(要注意的是要保持逻辑一致性,插入相等的值不要一会往右走,一会往左走)入新结点。当前节点是要删除的,如果当前节点的左是空的,并且当前节点是父亲节点的右节点的话,我们直接让我们的父亲节点指向我们的要删除节点的右节点。原创 2024-11-23 09:54:56 · 4804 阅读 · 113 评论 -
C++多态---面向对象的心动信号:多态之美
编译时多态(静态多态)主要就是我们前面讲的函数重载和函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时一般归为静态,运行时归为动态。注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用,不过在考试选择题中,经常会故意买这个坑,让你判断是否构成多态。原创 2024-11-30 12:13:14 · 1464 阅读 · 128 评论 -
纵然千万数据流逝,唯独vector长存
是一个二维的动态数组,可以理解为一个“向量的向量”或“嵌套的向量”。是一个非常灵活的数据结构,它允许存储和操作二维数据,且具有动态扩展的能力。无论在矩阵计算还是图表示中,它都是一种便捷且高效的选择。因为我们的vector不仅仅只存char类型,还存储其他的类型的数据。string的数组和vector的char类型有什么区别呢?很适合表示矩阵,并且可以直接应用于矩阵的加法、乘法等操作。内部数组的指针,可以用于与 C 风格的数组互操作。是不存在’\0’的概念的。的容量,即无需扩容时可以容纳的元素数量。原创 2024-11-06 12:23:17 · 1584 阅读 · 107 评论 -
当 push 成为一场冒险:走进 C++ List 的世界
提供了丰富的接口,能够满足各种链表操作需求,包括元素的插入、删除、访问、排序、合并、反转等。每个接口的使用场景各异,结合链表的特性可以实现高效、灵活的数据操作。:直接在容器末尾构造对象,而不需要创建临时对象。我们使用Insert的时候通常是需要用到find的,但是我们list里面是没有的,但是我们的算法库里面是存在的。:性能相对更高,因为它避免了临时对象的创建,直接在容器内构造对象,这在某些情况下可以提高效率。使用场景:如果需要频繁在链表头部插入元素,这个函数非常有用,因为头部插入的复杂度是 O(1)。原创 2024-11-16 11:30:52 · 1264 阅读 · 90 评论 -
C语言复习概要(二)
数组是一组相同数据类型的变量集合,这些变量存储在连续的内存空间中。通过使用数组,我们可以减少声明多个变量的复杂性,尤其在需要处理大量数据时,数组显得尤为重要。函数是具有特定功能的一段代码,通过将复杂的操作封装成函数,可以实现代码的复用和模块化。函数有助于提高代码的可读性和维护性。原创 2024-10-05 10:43:07 · 1358 阅读 · 90 评论 -
C语言复习概要(三)
递归是指一个函数调用自身来解决问题。递归通常用于分治法中,通过将问题分解成更小的子问题,递归地解决这些子问题,直到达到基本情况(递归终止条件)。本文通过讲解Visual Studio的调试技巧与C语言中的函数递归,展示了如何高效地调试代码以及如何通过递归解决复杂问题。掌握VS调试工具的使用可以帮助开发者更快地定位问题,而熟练运用递归能够让解决特定问题更加直观与简洁。通过结合这两部分内容,开发者可以更加高效地编写和调试代码。原创 2024-10-06 12:32:41 · 1273 阅读 · 98 评论 -
C语言复习概要(五)
从基础的内存操作到复杂的动态内存管理,指针的学习是一个循序渐进的过程。如果一个变量在内存中的地址不是正确对齐的,会导致额外的内存访问,影响性能。尽管它的学习曲线陡峭,但掌握指针不仅可以提高代码的性能,还能帮助我们理解计算机底层的工作原理。内存是程序运行时用于存储数据的场所,内存中的每个字节都有一个唯一的编号,即内存地址。越界访问是指针运算的常见问题之一,特别是在处理数组时,指针很容易移动到数组的边界外。这篇文章将通过逐步剖析指针的基础与高级应用,带你深入理解指针的工作原理,以及它在项目中的实际用法。原创 2024-10-15 09:48:21 · 1068 阅读 · 91 评论 -
与C++内存管理和STL简介的爱恨情仇
使用malloc时,内存内容是未初始化的;使用calloc时,内存内容会被初始化为零;使用realloc可以调整已分配内存的大小,可以根据需要扩展或缩小。3.C++内存管理方式注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。内置类型用malloc还是new都是可以的,但是自定义类型就不一样了自定义类型推荐使用newmalloc只会申请空间,但是new不仅会申请空间,还会调用构造函数。原创 2024-10-12 10:21:49 · 1963 阅读 · 129 评论 -
C语言复习概要(四)
本文。原创 2024-10-07 11:05:51 · 1345 阅读 · 97 评论 -
C语言复习概要(一)
本文详细介绍了C语言的常见概念、数据类型、变量的声明与初始化、分支结构以及循环结构,并通过多个代码示例展示了如何使用这些基本构件编写C语言程序。通过学习这些内容,初学者能够更好地理解C语言的基本结构和逻辑控制,为后续的高级编程技巧打下坚实的基础。C语言的简单性和灵活性使其成为计算机科学中的核心编程语言。掌握了本文介绍的内容后,建议继续深入学习指针、数组、结构体、函数等高级话题,进一步提高编程能力。原创 2024-10-03 21:36:47 · 3275 阅读 · 107 评论 -
与C++类和对象的宿命(下)
C++ 提供了多种类型转换方式,从隐式到显式,灵活地应对不同的需求。理解并合理使用这些转换方式,不仅能够提升代码的安全性和可读性,还能避免不必要的错误。希望这篇文章能帮助你理解C++中的类型转换,如果有具体的问题或不清楚的地方,欢迎继续讨论!静态成员变量在类内声明,在类外进行初始化。静态成员变量属于类本身,而不是某个具体的对象。静态成员变量可以通过类名访问,也可以通过对象访问(但不推荐)。静态常量成员变量如果是整型或枚举类型,可以在类内直接初始化;否则,必须在类外进行初始化。原创 2024-10-08 10:02:33 · 1398 阅读 · 151 评论 -
C语言复习概要(六)
通过理解数组名的本质、指针访问数组、函数传参中的指针使用、以及指针数组与多级指针的应用,我们可以编写出高效且灵活的C程序。本文将从数组名与指针的基本理解出发,深入探讨指针与数组的结合使用,并通过经典的冒泡排序算法和多级指针操作举例说明。但是在更底层的C语言内存模型中,数组名实际上是一个常量指针,它指向数组的第一个元素的地址。这说明数组名其实是一种特殊的指针,它和指针的行为非常相似,但在某些情况下,数组名与普通指针的行为略有不同。使用指针访问数组是C语言中非常常见的操作,它可以提高程序的效率。原创 2024-10-15 07:34:11 · 2065 阅读 · 80 评论 -
手撕C++入门基础
C++课程包括:C++语法、STL、高阶数据结构C++兼容之前学习的C语言打印hello world在这个代码中我们有很多地方不清楚头文件 #includemain函数上面的代码:using namespace std;打印hello world的代码:cout原创 2024-08-17 11:27:40 · 8234 阅读 · 101 评论 -
C语言---编译和链接
在 ANSI C 的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码。翻译环境就是编译和链接经过翻译环境的处理生成可执行程序(.exe文件)可执行程序在运行环境进行运行生成我们想要的结果那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下翻译环境所做的事情。其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编。原创 2024-07-15 08:48:44 · 1371 阅读 · 44 评论 -
爆学C++之类和对象(上)
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。原创 2024-08-19 11:26:25 · 1677 阅读 · 112 评论 -
C语言---预处理详解
这⾥我们想想,写⼀个函数求2个数的较⼤值的时候,不同的数据类型就得写不同的函数。原创 2024-07-18 09:35:30 · 1245 阅读 · 42 评论 -
C语言----文件操作
scanf/printf 针对标准输入流(stdin)/标准输出流 (stdout) /格式化输入/输出函数fscanf/fprintf 针对所有输入流(stdin)/输出流(stdout) /格式化输入/输出函数第一种只能在键盘上输入和输出第二种可以在文件和键盘上输入和输出那么sprintf和sscanf有什么作用呢?sprintfsprintf作用就是将格式化的数据输入到指针str所指向的空间(字符串中)可以理解为将格式化的数据转换为字符串struct Sint age;原创 2024-07-03 11:03:50 · 2921 阅读 · 42 评论 -
C语言---数据结构(1)--时间复杂和空间复杂度计算
时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。这里就不同了,因为我们使用malloc开辟了一个n+1个元素的空间,原本的变量就有5个,所以总共的变量就是N+6,但是6对结果的影响不大,所以这个题的空间复杂度就是O(N)了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度看的是我们最多的时候占了多少空间,也就是看最坏的情况的时候我们用了最大空间是多少。原创 2024-06-24 13:05:45 · 4123 阅读 · 34 评论 -
C语言---动态内存管理
指针+结构体+动态内存管理是学习数据结构的非常重要的知识这两种但是上述的开辟空间的⽅式有两个特点:• 空间开辟⼤⼩是固定的。• 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整,但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那数组的编译时开辟空间的⽅式就不能满⾜了。C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。原创 2024-06-21 14:18:33 · 2142 阅读 · 40 评论 -
手撕C++类和对象(中)
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最 后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后⾯再讲解。默认成员函数很重要,也⽐较复杂,我们要从两个⽅⾯ 去学习:• 第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。原创 2024-08-26 08:29:24 · 1379 阅读 · 105 评论 -
C语言--vs使用调试技巧
注:产品说明书中没有提到但是必须要做的事情,软件确没有实现。调试窗口中的自动调试会根据当前的位置将元素放出来,但是我们需要观察的元素可能会消失,一会有,一会没,试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码,调试是需要反复去动⼿练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能⼒,调试是需要反复去动⼿练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能⼒,运⾏时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运⾏时问题。原创 2024-07-01 08:51:56 · 1975 阅读 · 38 评论 -
C语言----自定义类型:联合和枚举
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。像结构体一样,联合体也是一个或者多个成员构成的,这些成员可以是不同的类型。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。联合体的特点是所有成员共⽤同⼀块内存空间。枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?define定义的话是全局的定义的。联合的大小至少是最大成员的大小。枚举的关键字是enum。原创 2024-06-20 10:56:52 · 1110 阅读 · 22 评论 -
C语言-----分支和循环
if语句后面不加分号,默认情况下if和else语句后面只能跟一条语句,如果要使用多条语句,可以用{}将想要多条表达的式子放进去else总是和离他最近的if配对if语句中,0表示假,非0表示真。原创 2024-04-17 16:38:18 · 495 阅读 · 2 评论 -
C语言---自定义类型:结构体
如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以⽤⼀个内存操作来读或者写值了。嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整数大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。位段的⼏个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位。跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。我们在涉及计算结构体的大小的问题的时候,就会面临结构体内存对其的问题了。原创 2024-06-19 10:48:05 · 1568 阅读 · 17 评论 -
C语言----数据在内存中的存储
1.正常存E的时候是E+中间值(127/1023),那么将这个取出来减去中间值就得到了E,对于M,将M取出+1就是我们要的M----这里的E不全为0或者不全为1。其实超过一个字节的数据在内存中存的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。原创 2024-06-17 12:03:42 · 1451 阅读 · 23 评论 -
C语言------数组
为了能够存放多个相同类型的数组,就有了数组!!数组是一组相同类型的元素的集合数组一般分为一维数组和多维数组数组在创建的时候可以指定数组的大小和数组的元素类型数组的语法格式:type arr_name ----------type指定的是数组中存放数据的类型,可以是char、short、int 、floatarr_name指的是数组的名字[ ]中的常量值是用来指定数组的大小,根据实际需要来定义数组是不需要取地址的。原创 2024-04-29 13:22:36 · 665 阅读 · 1 评论 -
C语言----深入理解指针(5)
sizeof计算变量所占内存空间的大小的,单位是字节sizeof只关注内存空间的大小,不在乎内存中方的什么数据sizeof是操作符不是函数sizeof会将\0算进去的那么strlen呢?strlen是c语言里面的库函数,是函数作用的求字符串长度的,只能针对字符串strlen统计的是字符串\0之前的字符个数只能指针字符串,求字符串长度不能求整形数组的strlen直到遇到\0,不然是不会停下来的。原创 2024-06-11 10:04:15 · 1473 阅读 · 24 评论 -
C语言---操作符详解
• 算术操作符: + 、- 、* 、/ 、%• 移位操作符: >• 位操作符: & | ^• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>= 、&= 、|= 、^=• 单⽬操作符:!、++、--、&、*、+、-、~ 、sizeof、(类型)• 关系操作符: > 、>= 、< 、<= 、 == 、!• 逻辑操作符: && 、||• 条件操作符:?• 逗号表达式: ,• 下标引⽤: []• 函数调⽤: ()原创 2024-05-09 19:04:13 · 1133 阅读 · 0 评论 -
C语言--深入指针(1)二刷
祝大家观看愉快,早日成为大牛。原创 2024-05-30 18:26:41 · 635 阅读 · 0 评论 -
C语言----深入理解指针(3)
使用%s打印字符串的时候,只需要提供首字符的地址就行了//这里的赋值是讲字符串中首字符的地址存在p中。原创 2024-05-23 11:08:20 · 989 阅读 · 0 评论 -
C语言----深入理解指针(1)
内存单元的编号 == 地址 == 指针cpu访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址。原创 2024-05-20 18:10:13 · 760 阅读 · 0 评论 -
C语言---扫雷游戏的实现
需要创建3个文件夹test.c----扫雷游戏的测试game.c----扫雷游戏的实现game.h----扫雷游戏的实现雷的信息使用二维数组存放• 使⽤控制台实现经典的扫雷游戏• 游戏可以通过菜单实现继续玩或者退出游戏• 扫雷的棋盘是9*9的格⼦• 默认随机布置10个雷• 可以排查雷扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息创建两个数组,一个存放雷,1是雷,0不是雷第二个数组就存放排查出的雷的信息,避免太过混乱,原创 2024-05-28 12:42:24 · 935 阅读 · 0 评论 -
C语言----C语言内存函数
针对内存块来处理的mem--memmory--内存内存块就是一块内存。原创 2024-06-15 12:48:44 · 1315 阅读 · 20 评论