- 博客(20)
- 收藏
- 关注
原创 栈与队列:两种基础却强大的数据结构
特性栈(Stack)队列(Queue)原则后进先出(LIFO)先进先出(FIFO)插入/删除端仅在一端(栈顶)插入在队尾,删除在队首典型应用函数调用、回溯、括号匹配BFS、任务调度、消息传递递归模拟天然支持需显式使用队列栈和队列虽简单,却是构建复杂系统不可或缺的基石。掌握它们的本质,不仅能写出更高效的代码,还能在面对算法问题时迅速找到合适的工具。下次当你写 DFS 或 BFS 时,不妨想想背后的数据结构哲学——顺序与规则,决定了程序的行为。
2026-02-13 15:28:38
337
原创 C++ STL 核心容器:深入理解 std::vector
是一个动态数组(dynamic array),位于<vector>头文件中。它在堆上分配内存,支持自动扩容,并提供随机访问能力。// 声明一个空的整型 vector与原生数组相比,vector自动管理内存:无需手动new/delete动态大小:可随时push_backpop_back安全边界检查(通过.at()兼容 STL 算法:如sortfindfor_each等是 C++ 中最通用、最高效的动态数组实现。掌握其内存模型、扩容机制和性能特性,能帮助你写出更安全、更高效的代码。记住三句话。
2026-02-08 11:49:30
336
原创 深入理解 C++ 中的 std::string:特性、使用与最佳实践
虽然实现自己的string类是学习 C++ 内存管理的好练习(如拷贝构造、赋值运算符、深拷贝等),但在生产代码中强烈建议使用。经过数十年优化,性能极高;支持 SSO(Small String Optimization):短字符串直接存储在对象内部,避免堆分配;完全符合 C++ 标准,兼容所有 STL 算法。💡 小知识:GCC 的对长度 ≤ 15 的字符串使用栈内存(SSO),极大提升小字符串性能!是 C++ 最成功、最常用的容器之一。
2026-02-05 17:30:59
633
原创 C++ 模板类:泛型编程的基石与现代 C++ 的核心力量
模板类是一种泛型类,它允许你在编写类时不指定具体的数据类型,而是用一个占位符(如T)代替。编译器会在你使用该类时,根据实际传入的类型自动生成具体的类代码。真相模板通常要放在头文件(.h / .hpp)中!因为编译器需要看到完整定义才能实例化。否则会遇到“undefined reference”链接错误。✅ 解决方案:将模板类的声明和定义都放在头文件中。维度价值体现开发效率一套代码适配无限类型代码质量逻辑集中,减少 bug性能编译期生成,零运行时开销可维护性修改一处,全局生效生态兼容。
2026-02-03 20:59:40
562
原创 【无标题】
理解程序的内存布局是成为优秀 C/C++ 开发者的必经之路。内存区域生命周期管理方式典型用途代码段程序运行期间编译器函数代码、字符串字面量数据段程序运行期间编译器已初始化全局/静态变量BSS 段程序运行期间编译器未初始化全局/静态变量堆运行时动态程序员动态分配的大对象栈函数调用期间编译器局部变量、函数参数掌握这些知识,你不仅能写出更高效的代码,还能快速定位和解决内存相关的问题。
2026-02-03 20:20:22
549
原创 【无标题】深入 C++ 对象初始化:初始化列表、构造函数与友元的正确打开方式
初始化列表优先:所有成员(尤其是类类型、const、引用)都应在初始化列表中初始化。构造函数保持简洁:只做初始化和简单校验,避免复杂逻辑或虚函数调用。友元谨慎使用:仅当公有接口无法满足需求时(如运算符重载),且尽量限制范围。顺序匹配声明:初始化列表的顺序应与成员变量声明顺序一致,避免未定义行为。初始化列表、构造函数和友元函数是 C++ 类设计中的“三剑客”。掌握它们不仅能写出高性能的代码(通过避免冗余操作),还能在封装性与功能性之间取得精妙平衡。
2026-01-28 20:59:12
505
原创 【无标题】掌握 C++ 对象的生命周期:构造与析构
在 C++ 的世界里,没有垃圾回收器为你兜底,你就是资源的守护者。而构造函数与析构函数,正是你手中最可靠的工具。善用 RAII,敬畏生命周期,你的程序将更加可靠、优雅。希望这篇总结对你有帮助!
2026-01-27 18:34:01
551
原创 【无标题】深入理解 C++ 结构体内存布局与 this 指针机制
在 C++ 的非静态成员函数中,编译器会隐式传入一个指针,指向调用该函数的对象本身——这就是 this指针。public:// 等价于 name = n;概念关键点结构体(struct)用户自定义类型,默认 public,可含函数结构体大小受内存对齐影响,sizeof≠ 成员大小之和内存对齐提升访问效率,可通过控制this 指针非静态成员函数的隐式参数,指向调用对象理解结构体的内存布局,能帮助你写出更高效、更节省内存的代码;掌握this指针,则是深入面向对象编程的必经之路。📌小练习char a;
2026-01-26 17:33:28
692
原创 c++代码的四大基础特性
允许在同一个作用域内定义多个同名函数,只要它们的参数列表不同(类型、数量或顺序不同)即可。print(42);// 调用 int 版本// 调用 double 版本// 调用 string 版本返回值类型不能作为重载依据。const修饰成员函数可参与重载(如vsvoid f()函数重载让接口更统一、代码更直观,是 C++ 多态性的基础之一。特性作用使用场景命名空间避免命名冲突大型项目、库开发内联函数减少函数调用开销简短、频繁调用的函数函数重载同名多义统一接口,提升可读性引用。
2026-01-26 16:11:47
394
原创 C语言之文件
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。以ASCII字符的形式存储的⽂件就是⽂本⽂件。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
2025-09-13 10:11:46
772
原创 C语言库函数的模拟实现要注意的问题
如果要比较两个字符串的内容要用strcmp,这里需要注意strcmp函数比较两个字符串是否相等时会比较到\0;2.两个数组如果写成arr1==arr2是在比较地址,不是比较里面的内容。两个字符串“abcdef”==“abc”也是在比较地址。1.strlen函数的返回值size_t是无符号的。(2)‘0’是字符0 ASCII码值是48。(4)‘\0'——字符——ASCII码值0。(3)NULL——空指针——0。(5)""——空字符串。
2025-08-30 21:08:56
139
原创 整数和浮点数在内存中的存储(要注意的问题)
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
2025-08-27 16:41:37
250
原创 C语言学习要注意的问题 (指针篇 下)
解释:p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过。之前我们学习了指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。结合,说明 parr1是数组,数组的内容是什么呢?p是⼀个指针,指向⼀个数组,叫 数组指针。数组指针变量是指针变量?
2025-08-14 16:31:51
1554
原创 C语言学习要注意的问题 (指针篇 中)
那么在数组参的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组⾸元素的地址。sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素。数组传参的本质是传递了数组 首元素的地址,所以传参访问的 数组和实参的是是同一个数组。形参的数组是不会单独再创建 数组空间的,所以形参的数组是 可以省略掉数组大小的。计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。
2025-08-14 15:47:27
321
原创 C语言学习要注意的问题(指针篇 上)
如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指。指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各。注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。3.指针指向的空间释放。
2025-08-14 14:58:19
761
原创 C语言学习过程可能要注意的问题(四)(分支和循环语句 下)
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建。switch语句中的case和default的顺序问题。语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出。语句是没有顺序要求的,只要你的顺序是满⾜实。被执⾏,直接就会跳出循环,继续往后执。语句中的代码执⾏完成后,需要加上。两个关键字,就是应该到循环中的。的作⽤是⽤于永久的终⽌循环,只要。如果找不到对应的值,后的值,必须是整形常量表达式。
2025-07-23 17:08:39
267
原创 C语言学习中要可能注意的问题(三)(分支和循环语句 上)
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。只要带上适当的⼤括号,代码的逻辑就会更加的清晰,让代码的可读性更⾼。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的。操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
2025-07-23 16:45:08
389
原创 C语言学习中可能要注意的问题(二)
这个系列会根据我学习C语言的进度持续更新,大家如果喜欢的话可以点点关注,持续关注最新动态。同时上面是我学习C语言时觉得的一些比较细的点、我觉得我应该注意的点,可能不够全面,如果发现问题,大家可以提出,我看见后会及时回复。希望文章内容对大家有帮助。(3) 函数调用语句。
2025-07-20 16:24:49
159
原创 C语言学习给自己的提醒(一)
1.键盘上敲出的字符,如:a @ #等在C语言中称为字符,要用单引号(‘’)括起来,同时它在C语言中存储的形式也是二进制,遵循ASCII码表。main函数是可以有参数的,参数是特殊用途的,如果不想使用可以不写,写了也可以不用。4.printf函数。
2025-07-20 15:56:45
190
原创 C语言是什么?
1. C语言是一门编译型的语言(Python是解释性语言),C语言的源代码都是文本文件,文本文件本身无法执行,必须通过编译器翻译和链接器链接,生成二进制的可执行文件才能执行。其中每个源文件(.c后缀)单独经过编译器处理生成对应的目标文件(.obj后缀文件),然后多个目标文件和库文件经过链接器处理生成对应的可执行文件(.exe文件)2.其中常见的C语言编译器有msvc、gcc等,当然也有一些集成开发环境(除了编译还有很多其他功能)(IDE)如VS2022、DevC++等。
2025-07-19 22:17:27
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅