- 博客(46)
- 收藏
- 关注
原创 一(3)理解 newNode->next = head 和 Node* temp = head 的区别
C语言中指针变量存储内存地址,是链表操作的基础。指针赋值(如temp=head)复制地址值,使多个指针指向同一节点。链表节点包含数据域和指向下一节点的指针域。头插法通过newNode->next=head将新节点连接到链表头部,再用head=newNode更新头指针。这种地址复制机制使得链表操作直观高效,新节点插入后成为新的头节点,原链表成为其后继。理解指针的地址复制本质是掌握链表操作的关键。
2025-08-05 21:50:52
938
原创 一(2)关于单链表中的疑问 head = head->next; 和 head->next = head 的核心区别
这篇文章对比分析了链表操作中两个关键语句的区别:head=head->next和head->next=head。前者是合法操作,通过临时指针保存原头节点后移动头指针到下一个节点,常用于链表遍历或头节点删除;后者则是错误操作,会使头节点指向自身形成死循环,破坏链表结构。文章通过代码示例验证了两种操作的不同效果,并强调后者通常会导致链表无法正常使用。理解这两种操作的本质区别对正确处理链表操作至关重要。
2025-08-04 22:47:49
836
原创 一(1)关于单链表中的疑问
摘要: Node*temp=head;是将头指针head存储的节点地址复制给临时指针temp,使两者指向同一链表节点(或均为NULL)。此时: 指针关系:temp是head的副本,修改temp的指向(如temp=temp->next)不会影响head,但通过temp修改节点内容(如temp->data)会同步反映到head指向的节点。 作用:避免直接操作head导致链表入口丢失,常用于安全遍历链表。 关键点:指针赋值是地址复制,非指向反转;temp作为临时变量可维护头指针稳定性,提升代码安全性。
2025-08-04 22:20:53
730
原创 C语言实现单链表的操作
单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针。文章详细介绍了单链表的基本操作:创建节点、头插法/尾插法插入节点、遍历打印链表、删除头节点、释放链表内存等。重点讲解了指定位置插入节点的两种实现方式(前插和后插),并分析了边界条件处理。单链表的优点在于动态大小和高效插入删除(头插O(1)),缺点是查找效率低(O(n))和需要额外指针空间。文中提供了完整的C语言实现代码,包括测试用例,适合初学者理解单链表的基本原理和操作方法。
2025-08-04 21:28:20
846
原创 数组和指针的关系
C语言中指针和数组既有联系又有本质区别。数组名在大多数情况下会退化为指向首元素的指针(如arr等价于&arr[0]),但数组名本身不是指针变量,不能重新赋值。关键区别在于:指针是变量可修改指向,而数组名是常量指针;arr和&arr值相同但类型不同(int* vs int()[n]),导致指针运算步长不同。数组访问arr[i]本质是指针算术(arr+i),函数传参时数组会退化为指针,无法在函数内获取数组大小。指针更灵活可指向任意内存,而数组是固定大小的连续内存块。
2025-08-03 22:43:27
613
原创 写一个检测Ubutn系统开机的Bash脚本
这篇Bash脚本示例展示了如何获取并输出系统时间、启动时间和最后登录用户信息。脚本首先获取当前时间、系统启动时间和最后登录用户,然后进行对比判断当前用户是否为最后登录者。执行结果显示当前时间为2025年7月2日18:14,系统启动于18:04,最后登录用户为root,且当前用户正是root。脚本通过简单的系统命令组合实现了基本的系统信息查询功能。
2025-07-02 18:20:45
114
原创 C++ mutex 锁的使用
在 C++ 中使用std::mutex定义互斥锁:通常定义为全局变量或在需要保护的类中作为成员变量。加锁和解锁:直接使用mtx.lock()和(不推荐,容易出错)。使用(推荐,简单安全)。使用(适用于需要更灵活控制的场景)。锁定多个互斥锁:使用std::lock避免死锁。避免死锁:确保锁的获取顺序一致,或使用std::lock等工具。通过合理使用std::mutex及其相关的 RAII 工具,可以有效地实现线程间的同步,保护共享资源,避免数据竞争和死锁问题。
2025-06-10 22:30:33
731
原创 Ubutn系统查看磁盘
system 系统 extend4 扩展文件系统第四代。4.起始扇区(2048-10485759,默认为2048):选择回车键。/dev/sdb1 第二块串口硬盘的第一个分区,准备格式化了。5.输入分区大小 +“2G” 回车。make 创造 file 文件。创建挂载点,一个分区一个挂载点。2.按“p”键,选择主分区。3.选择分区号,默认为1。
2025-06-09 22:17:25
140
原创 十一(3) 类,加深对拷贝构造函数的理解
【摘要】拷贝构造函数是C++中用于对象克隆的特殊成员函数,通过引用传递同类型对象进行初始化。默认的浅拷贝存在资源共享风险,需自定义深拷贝来独立复制动态资源。拷贝构造函数的调用时机包括对象初始化、函数值传递和返回对象。关键注意事项:参数必须为引用以避免递归;动态资源类需实现深拷贝;C++11后可用移动构造函数优化资源转移。合理使用拷贝构造函数能确保对象复制的安全性和独立性,是管理类资源的重要机制。
2025-06-09 21:21:12
998
原创 十一(2) 类的实例化
本文介绍了C++中构造函数的基本概念与使用方式,重点阐述了以下内容:1)构造函数的定义规则,包括函数名必须与类名相同、无返回值类型以及在对象创建时自动调用;2)类声明与实现的分离方法,建议将声明放在.h头文件,实现放在.cpp源文件;3)对象的多种定义方式,包括栈中定义单个对象和对象数组,以及使用new在堆中动态分配对象和对象数组。文章还说明了不同定义方式对应的构造函数调用形式和内存管理注意事项。
2025-06-08 20:30:11
407
原创 十二.理解Const关键字
C++中的const对象与常函数机制:const修饰的对象、指针或引用为常对象。常函数通过在成员函数后加const实现,其this指针具有常属性。常函数和非常函数可重载,非常对象优先调用非常版本,常对象只能调用常版本。常函数内部无法修改成员变量(除非用mutable修饰)。该机制用于保证对象状态的不可变性,增强程序安全性。
2025-06-08 16:58:28
231
原创 十一.C++ 类 -- 面向对象思想
C++类的基本结构与this指针解析摘要:本文介绍了C++类的定义结构,包括构造函数、析构函数、成员变量和成员函数的声明方式,以及public/private/proprotected三种访问控制权限的区别。重点讲解了this指针的工作原理:每个成员函数都隐含一个指向当前对象的this指针,通过该指针访问成员变量。演示了this指针的实际应用场景,包括区分同名参数、实现链式调用(返回*this)和对象间交互。通过Human类的示例代码,展示了如何使用this指针进行成员变量赋值和自引用返回。
2025-06-08 14:06:33
415
原创 如何在c/c++中定义和使用宏
本文介绍了C/C++中的宏定义和条件编译机制。宏定义分为对象式宏(如#define PI 3.1415926)和函数式宏(如#define MAX(a,b)),在预处理阶段进行文本替换,使用时需注意括号和多行定义的处理。条件编译通过#ifdef、#ifndef、#if等指令实现,其中#ifdef检查宏是否定义,#if使用表达式判断,并可用#elif和#else进行多分支控制。#undef可取消宏定义,#pragma once能防止头文件重复包含。这些预处理指令为代码提供了编译时的灵活控制能力。
2025-06-07 21:54:09
495
原创 十(1). 强制类型转换
C++强制类型转换的四种方式总结:static_cast:最常用的类型转换方式,可用于基本数据类型转换、类层次结构中的指针/引用转换(向上/向下转换)、void*指针转换等。在编译时完成转换,不进行运行时检查。dynamic_cast:主要用于类层次结构中的安全转换,特别适用于多态类型(有虚函数的类)。进行运行时类型检查,若转换失败会返回nullptr(指针)或抛出异常(引用)。reinterpret_cast:最危险的类型转换,允许任意指针/引用类型间的位级转换。不进行类型检查,可能导致
2025-06-07 21:13:46
824
原创 如何判断指针是否需要释放?
在C++中判断指针是否需要释放需考虑:1.来源:动态分配(new/malloc)的必须释放,智能指针管理的自动释放;2.生命周期:局部变量通常在函数结束时释放,类成员在析构时释放,全局变量在程序结束时释放;3.所有权转移:明确函数参数/返回值的释放责任。建议优先使用智能指针避免手动管理风险,如必须手动管理则需确保正确释放时机。
2025-06-07 20:33:26
451
原创 指针的定义与使用
指针专题摘要本文介绍了指针的基础概念及高级用法。基础部分涵盖指针定义(int* p)、取址符(&)和解引用(*p),演示了通过指针修改内存值的操作。重点解析了指针常量(int* const p,指向不可改)与常量指针(const int* p,值不可改)的区别。随后探讨了指针数组(存放指针的数组)和数组指针(指向整个数组的指针)的声明与使用差异,并通过示例展示了数组指针的两种访问方式。最后介绍了函数指针的声明(double (*pf)(int))和调用方法((*pf)(args)),包括typedef简化
2025-06-07 20:18:25
464
原创 十.显式类型转换
摘要:本文系统介绍了C和C++中的类型转换机制。C语言采用(type)expression形式的简单类型转换,缺乏安全性检查。C++则提供四种类型转换:1)static_cast用于相关类型转换(如继承关系、基本类型转换);2)dynamic_cast用于多态类的安全向下转换;3)const_cast用于修改const/volatile属性;4)reinterpret_cast用于低级别位模式重解释(风险高)。此外还介绍了自定义类型转换的实现方式,包括隐式转换(转换构造函数/运算符)和显式转换(使用expl
2025-06-03 22:10:36
971
原创 九(5).引用和指针的区别
指针的目标可以在初始化后随意变更(除非是指针常量),而引用一旦初始化就无法变更其目标。存在指针数组,不存在引用数组,但存在数组引用。,因此C++语言引用与指针存在明显区别。存在指向指针的指针,不存在引用的引用。指针可以不初始化,引用必须初始化。存在指针的引用,不存在引用的指针。在实现层面,引用就是指针。存在空指针,不存在空引用。
2025-06-03 19:35:58
170
原创 九(4).存在指针的引用,不存在引用的指针
C++中指针可以引用,但引用不能指针化。"指针的引用"(如int*&)合法,是对指针的别名,修改会影响原指针;而"引用的指针"不存在,因为引用没有独立地址且不可重绑定。技术要点:1.指针引用用于函数参数修改调用者指针;2.引用本质是别名,无法获取地址;3.&ref语法非法。典型应用场景是动态内存管理时传递指针引用,而非试图创建引用的指针。
2025-06-02 23:46:04
576
原创 九(3).引用作为方法别名返回
C++函数返回引用是一种高效但需谨慎使用的技术。返回引用能避免对象拷贝,直接操作原始数据,但存在生命周期和安全风险。常见用法包括返回全局/静态变量、成员变量、堆对象及参数本身的引用,但禁止返回局部变量引用。返回引用分为非const(可修改)和const(只读)两种类型,后者常用于保护内部数据。关键注意事项是确保被引用对象在函数返回后仍然有效,否则会导致未定义行为。正确使用返回引用能提升性能,但需权衡安全性和对象生命周期管理。
2025-06-02 22:20:46
683
原创 九(2).参数类型为引用结构体类型
C++中const引用传递结构体是一种高效且安全的参数传递方式,适用于只读访问场景。其核心优势在于避免大型结构体的拷贝开销,同时保证数据不被修改。基本用法为const Point& p,允许读取成员但禁止修改。适用场景包括:打印/日志记录、处理大型结构体、绑定临时对象。注意事项包括不能调用非const成员函数、需小心指针成员等问题。与普通引用相比,const引用更安全但不允许修改;与值传递相比,const引用更高效。最佳实践是优先使用const引用,仅在需要修改时用普通引用。
2025-06-02 20:41:47
795
原创 九(1). 引用作为函数参数的使用
C++引用参数使用指南:引用作为函数参数可避免拷贝开销,直接操作原始数据。主要分普通引用(允许修改参数)和const引用(只读访问)。相比值传递和指针传递,引用更高效且安全,尤其适合处理大对象。最佳实践包括:优先用const引用传递大对象、用普通引用修改参数、避免对小型对象滥用引用、区分const/nonconst重载。常见误区包括忽视小型对象的值传递优势、误解const引用权限等。核心原则是:大对象优先const引用,需修改时用普通引用,简单类型可值传递。合理使用引用能显著提升性能。
2025-06-02 19:15:07
645
原创 九.C++ 对引用&的学习
本文详细介绍了C++中引用的基本概念与const引用的特性。引用作为变量的别名,必须初始化且不能更换对象,所有操作都作用于目标内存。通过代码示例展示了引用赋值对目标变量的影响。重点解析了const引用:它是只读的,可绑定const/non-const对象,能延长临时对象生命周期,常用于函数参数避免拷贝。文章比较了普通引用与const引用的区别,指出const引用在安全性方面的优势,并强调其不能用于移动语义。最后给出了最佳实践建议:优先用const引用传递大对象,注意返回引用的生命周期,合理选择值传递或引用传
2025-06-02 18:34:14
1070
原创 try catch 捕获异常的用法
摘要:C++的try-catch机制用于异常处理,基本语法包括try块(可能抛出异常的代码)和catch块(捕获特定或通用异常)。通过示例展示了如何抛出和捕获标准异常及自定义异常,强调应使用const引用捕获异常以提高性能。关键概念包括异常传播和捕获优先级。最佳实践建议优先使用标准异常类、避免捕获所有异常、使用RAII管理资源,并确保异常安全(基本/强/不抛保证)。常见错误包括未处理捕获的异常、危险操作继续执行和资源泄漏。总结强调应明确捕获特定异常、使用RAII替代手动资源管理,并在构造函数/析构函数中谨慎
2025-06-02 12:02:19
718
原创 动态内存分配 new
摘要:本文介绍了C/C++动态内存分配方法。在C中使用malloc/free,C++使用new/delete进行单个变量和数组的内存分配/释放。重点讲解了二维数组的三种实现方式:1)指针数组法(行不连续),2)数组指针法(连续存储),3)推荐使用的vector容器(自动管理)。同时强调了释放内存后的指针置空操作和异常处理机制。通过对比各方法的优缺点,指出vector是最安全便捷的选择,而数组指针法适合固定行列且追求性能的场景。
2025-06-02 11:30:45
457
原创 内联函数 inline -- 编译器的优化策略
每个普通函数调用语句都需要发生跳转操作,这种跳转操作都会带来时间开销。(1)内联就是函数已被编译好的二进制代码,替换对该函数的调用指令。(2)内联在保证函数特性的同时,避免对函数调用的时间开销。该函数被优化为内联,但是否适合内联则完全由编译器决定。(4) so库文件中也不适合使用内联函数。可执行文件的体积和进程代码的内存变大。(2) inline 关键字仅表示。稀少被调用的复杂函数和递归函数。在普通函数前面加个关键字。
2025-06-01 12:26:47
239
原创 AIDL Failed to resolve ‘IMyCallback‘ 错误
在项目中创建aidl文件引入另一个aidl文件发现Failed to resolve 'IMyCallback' 错误。
2025-02-16 13:11:18
366
原创 C++ 中使用 uint32_t/uint64_t
uint32_t是一个无符号 32 位整数类型,它是 C 语言标准库中的stdint.h头文件定义的一个整数类型。uint32_t:表示一个无符号整数,即该变量只能存储非负整数。32 位:指这个整数类型占用 32 位(4 字节)的内存空间。无符号:意味着它不包含负数,只能存储 0 和正整数。在stdint.h文件中在 C++ 中,你可以使用uint32_t来表示一个无符号的 32 位整数,只需包含cstdint头文件。uint64_t。
2024-12-21 11:17:26
5081
原创 C++ 实现一个类
如果有多个成员变量,使用构造函数传递多个参数时,要注意构造函数的顺序应与成员变量的声明顺序一致,因为初始化列表的参数顺序是固定的。构造函数的参数顺序并不影响实际的成员变量初始化顺序,成员变量的初始化顺序是按照它们在类中的声明顺序来初始化的。,它在构造函数的开始部分直接对类的成员变量进行初始化。是推荐的做法,它提供了更高的性能和更简洁的代码,特别是在处理复杂类型时。相比于初始化列表,额外的默认构造和赋值操作造成了一定的开销。初始化成员变量,然后在构造函数体内将传入的参数值赋给成员变量。这两种写法的区别在于。
2024-12-17 22:10:01
1153
原创 0/1 背包问题 -- 用贪心算法思想实现
物品2 - 价值: 70, 重量: 10。物品3 - 价值: 60, 重量: 10。物品1 - 价值: 66, 重量: 6。物品4 - 价值: 40, 重量: 8。
2024-12-09 21:29:25
634
原创 sprintf 将格式化的数据写入字符串
sprintf用于将格式化的数据写入字符串。使用时要特别注意缓冲区的大小,避免溢出。为了避免潜在的溢出问题,推荐使用snprintf,它可以安全地限制写入的字符数。
2024-12-08 17:58:33
686
原创 PS处理水印文字
2.4 选择 -- 色彩范围 -- 取样颜色 -- 选中要去掉的水印文字颜色 -- 选择合适的颜色容差 -- 点击确认。2.5 选择 -- 修改 -- 扩展 -- 扩展量(修改为10) -- 确认。2.7 ctrl + e,合并两个图层,这个时候复制的那个图层就会被合并。2.8 点击 Del 删除键,会跳出一个弹窗(填充),使用选择“2.6 显示出原先的那个原图层(还是点击那个小眼睛打开即可)2.3 隐藏掉原先的那个图层,点击那个小眼睛。这个时候水印文字就会消失,即表示去水印成功了。,点击确定 == 》
2024-12-08 13:42:45
895
原创 C语言 宏定义使用 -- 预编译,预处理
常量宏定义一个宏int main()// 输出 1500// 输出 hello bit宏函数(带参数的宏)#define SQUARE(x) ((x) * (x)) --》 x的平方#define DOUBLE(x) (x+x) --》 x的两倍// 输出 6// 输出 25PRINT(ml);// 输出 the value of ml is 10PRINT(ml2);// 输出 the value of ml2 is 20结论:宏定义里面的#N会转换为""进行拼接。
2024-12-02 21:57:44
464
原创 数组作为方法参数中和在main方法中的区别
/ 定义一个包含 5 个整数的数组// 数组可以在定义时初始化:// 定义并初始化数组// 如果数组的大小在初始化时省略,编译器会根据提供的元素数量自动计算:// 数组大小自动为 5i < size;int main()// 数组作为参数传递明明是数组作为参数传递,结果数组大小却不一样,本来是将数组作为参数进行拷贝,其实只是创造具有相同名称的指针变量,而不是创建整个数组,编译器只是复制第一个元素的地址4.1 用指针进行访问数组。
2024-11-03 16:29:28
372
原创 内存参数sysctl_lowmem_reserve_ratio,min_free_kbytes
函数在系统管理中起着重要作用。它会在 或 发生变化时被调用,以更新系统中应保留的低内存页面总数。根据系统的低内存()大小来初始化 参数,以确保系统在不同规模的机器上保持适当的空闲内存。其核心逻辑如下:我们来用公式 进行几个具体例子的计算。
2024-10-26 22:42:15
841
原创 C语言实现创建文件功能
以下是一个完整的示例,展示如何在当前目录下创建一个子目录,并在该子目录中创建一个文件。程序成功运行后,会在当前目录下创建一个名为。程序成功运行后,将在当前目录下创建一个名为。的子目录,并在该子目录中创建一个名为。模式打开文件,表示以写入模式打开文件。的文件,并在其中写入两行文本。在当前目录下创建一个子目录。在 C 语言中,您可以。
2024-10-17 22:37:16
1262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人