自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 python高级特性

特性解决的问题一句话概括切片取子序列的代码太啰嗦,包头不包尾,一个操作符替代各种截取函数迭代遍历不该依赖下标for...in统一作用于一切可迭代对象列表生成式造列表要写循环[表达式 for x in 可迭代对象 if 条件],声明"要什么"而非"怎么做"生成器大列表浪费内存保存算法不保存数据,yield让函数可暂停,按需计算迭代器——iter()next()简洁和惰性。切片与推导式把"十行循环"压成"一行声明",生成器与迭代器把"先造好一百万个"变成"用一个算一个"。

2026-09-03 15:39:17 210

原创 Python 语法基础(五)

所谓的库,就是别人已经写好了的代码,可以直接拿来用。比如你想算平方根,不用自己写牛顿迭代法,math.sqrt拿来就用;想操作 excel,不用研究二进制文件格式,装个库读现成的。分类来源使用前提例子标准库Python 自带装了 Python 就有,直接 importdatetimeosrandomthreading第三方库全世界的开发者先用 pip 安装,再 importqrcodexlrdpynput。

2026-08-31 15:49:08 170

原创 Python语法基础(四)

列表:能混装类型的动态数组。下标从 0 起、支持负数;切片是前闭后开区间(和 range 同源),带步长、可倒序、越界安全;增删查一套方法家族。最要命的是——容器里装的是标签,b = a是贴标签不是拷贝,两个名字管一个列表,想要独立副本必须显式[:]。元组:只读的列表,单元素要写(1,)。函数多返回值、变量交换、解包全靠它。不可变不是缺陷是资格——传参防篡改,以及:字典:键值对哈希表,key 必须可哈希,于是可变的列表出局、不可变的元组入围。[]严格(KeyError)、get温柔(None/默认值)

2026-08-31 15:47:43 236

原创 Python语法基础(三)

def 函数名(形参列表) : 函数体 return 返回值还是熟悉的配方:冒号结尾、缩进表示函数体——和第二篇的 if / for 完全一致,缩进这套语法体系在函数这里也一样适用。参数(输入)——形参不写类型,是动态类型的延续;没有重载,因为一个函数天生多态;默认值、关键字参数让调用端可以按需精确控制。坑:可变默认参数是共享的,用 None 哨兵。返回值(输出)——逻辑与交互分离,函数只管算,怎么用是调用者的事;多返回值就是元组打包解包,C++ 结构化绑定的前辈。作用域(围墙)

2026-08-31 15:47:04 212

原创 Python语法基础(二)

回到开头的两个问题,现在可以给出完整的回答。**缩进为什么能当语法?**因为它把"代码该怎么排"从风格约定升级成了语言规则。C++ 的哲学是给你自由——缩进随意、空块随意、else 配对错了编译器不吭声,代价是这些自由里埋着悬垂 else、手滑分号这样的祖传坑,代码可读性全靠程序员自律。Python 的选择是把最佳实践直接写进语法:缩进错了不让跑、空块必须显式 pass。你失去了一点书写自由,换来的是任何人写出的 Python 结构都一目了然,一大类 C++ 经典 bug 在这里结构上无法存在。

2026-08-29 15:55:37 254

原创 Python语法基础(一)

C++ 的语法贴近机器,Python 的语法贴近人的直觉。真除法 vs 截断除法——一个贴近数学,一个贴近硬件指令int无上限 vs 固定宽度——一个给数学看,一个给寄存器看动态类型 vs 静态类型——一个省代码,一个换编译期安全没有++——砍掉方便,消灭易错变量是标签 vs 变量是盒子——两种完全不同的心智模型没有孰优孰劣,只有场景取舍:C++ 用"贴近机器"的设计换来了极致性能,Python 用"贴近直觉"的设计换来了开发效率。

2026-08-29 14:27:49 228

原创 Ext 文件系统底层原理

回到开头那句话:磁盘是"元素为扇区的一维数组",文件系统在这个数组上"先描述、再组织"。描述:超级块描述整个分区,GDT 描述每个块组,两张位图描述空闲状态,inode 描述每个文件——全都是实打实写在磁盘上的结构体数据。所谓格式化,就是把这套描述写进去组织i_block[]多级索引把 inode 连向数据块;目录文件把文件名连向 inode;dentry 树把路径缓存进内存;挂载把多个分区拼进同一棵目录树;软硬链接在"名字 → inode"这一层做文章ls -l是读 inode 打印字段,touch。

2026-08-28 16:07:05 492

原创 Linux 基础文件IO

我们平常说的缓冲区其实有两个:一个是 C 标准库封装的用户级缓冲区,另一个是操作系统自带的内核缓冲区。我们平时写代码用的 printf、fprintf、fputs,在打印的时候其实都是先把数据拷贝到 C 语言(用户层)提供的缓冲区里——因为频繁调用系统接口会让程序效率十分低下,所以 C 语言层就封装了这样一层缓冲区。只有当我们手动刷新(fflush)、满足刷新条件,或者进程正常结束的时候,用户级缓冲区里的数据才会被拷贝到系统缓冲区(内核层),再由系统缓冲区写入对应的硬件。

2026-08-27 15:05:26 351

原创 Linux 进程控制

Linux 进程控制的四个环节 — 创建、执行、等待、终止 — 构成了一个完整的闭环。fork 创建:唯一创建新进程的方式,通过写时拷贝实现高效的父子分离exec 替换:不创建新进程,而是赋予进程全新的代码和数据wait 回收:父进程获取子进程退出状态,防止僵尸进程,回收系统资源exit 退出:释放资源,返回退出码,通知父进程这四个环节通过 fork+exec → wait → exit 的经典组合,完成了进程从生到死的完整生命周期。

2026-08-23 10:44:47 339

原创 Linux 进程概念深度剖析

注意这些状态值不是连续的整数,而是 2 的幂次方——这是因为它们被设计成位标志,可以组合使用。冯诺依曼体系规定了以内存为中心的数据流动模式,是进程必须驻留内存的根本原因操作系统通过"先描述再组织"的方式管理一切,就是进程的"身份证"进程状态机的每个状态都有明确语义,僵尸进程的存在是为了传递退出信息,孤儿进程被 init 领养是系统的安全网O(1) 调度器用 bitmap + 双队列的设计,把进程调度的复杂度从 O(n) 降到了常数级虚拟地址空间。

2026-08-20 18:08:58 352

原创 C++ 继承

学完类与对象之后,继承是 C++ 面向对象编程里第一个真正让人"开窍"的概念。很多人学继承的时候只记住了这种写法,但对于底层到底发生了什么、内存里到底是怎么排布的,一问三不知。让你不仅能写出继承的代码,还能在脑子里画出任意继承体系的内存布局。不管是面试还是看 STL 源码,这些底层知识都会反复用到。三种继承方式控制的是基类成员在派生类中的最高访问权限,private继承几乎只在实现细节中使用。构造顺序:基类 → 成员 → 自身。析构顺序相反。析构函数要声明为 virtual。内存布局。

2026-08-13 08:01:44 406

原创 Linux 基础开发工具

大多数编辑器是"所输即所得"——打开就能打字。命令模式、插入模式、底行模式。初学者觉得反人类,但这恰恰是 Vim 高效的根源。在命令模式下,键盘上的每个键都是快捷键。不需要 Ctrl 组合,不需要鼠标,手指不离开主键区就能完成所有操作。这种设计在远程服务器(没有 GUI)场景下优势巨大。一套 Linux 开发工具链的协作关系,本质上是一条从源码到运行的流水线:fill:#333;important;important;fill:none;color:#333;color:#333;important;

2026-08-12 09:18:58 473

原创 Linux基础指令入门

把这篇涉及的内容做个快速回顾:Linux的本质是通过Shell与内核沟通,所有文件组织成一棵目录树,路径有绝对和相对之分。日常操作围绕文件管理展开——ls查看、cd跳转、touchmkdir创建、rm删除、cpmv复制移动。查看文件内容用cat(短文件)、less(长文件)、headtail(头尾)、grep(搜索)。记不住参数就man,找不到文件就find。权限管理是Linux安全体系的核心:用户分root和普通用户,文件权限分u/g/o三类人,rwx三种权限,用chmod修改、chown改所有者、

2026-08-12 09:05:11 334

原创 C++ 模板进阶

模板的实例化需要同时看到声明和定义。普通函数只需要看到声明就能编译(链接时找定义),但模板必须在编译时就知道完整的定义,因为编译器要根据定义生成特定类型的代码。这是 C++ 编译模型的先天限制。Java 的泛型用擦除(erasure)避免了这个问题——编译后类型信息没了,所有泛型代码共用一份字节码。C++ 模板用代码生成(code generation),编译后为每个实例化类型生成独立代码,所以必须在编译时看到完整定义。非类型模板参数是编译期常量注入。

2026-08-08 16:37:52 326

原创 stack、queue 与 priority_queue 底层剖析

/ 小堆:top() 返回最小元素是一个函数对象(functor),内部重载了operator()堆算法在比较时用comp(a, b)判断"a 的优先级是否低于 b"。greater让"大值"被视为"低优先级",于是小值上浮到堆顶。对于自定义类型,你需要提供operator<(用于大堆)或operator>(用于小堆)。如果两个都提供,可以灵活切换。它们是适配器,不是容器。所有操作都委托给底层容器,自己没有存储语义。默认底层是 deque 不是偶然。

2026-07-18 08:01:53 454

原创 List详细讲解

这篇不讲push_back怎么用。如果你还在记接口,先去翻文档。这里只聊 list 的底层——内存怎么排、迭代器怎么封、反向迭代器为什么是那个鬼样子,以及 list 在现代硬件上到底还行不行。

2026-07-18 07:58:00 445

原创 C++ vector详解:最常用的STL容器

vector是一个类模板,可以存储任意类型的元素。它的数据在内存中是连续存储的,这一点和普通数组一样,所以支持随机访问,通过下标就能直接定位到某个元素,效率很高。使用vector能用:知道常用接口,能写出功能正确的代码明理:理解底层原理,知道为什么这样用,遇到问题能排查能扩展:能自己模拟实现,甚至根据需求定制这篇文章的目标是带你从前两个境界走一遍。vector的迭代器底层就是指针。当底层空间发生改变(比如扩容)时,原来的空间被释放了,迭代器指向的内存就无效了。如果继续使用这个迭代器,就会导致。

2026-06-13 10:35:16 222

原创 C++ string类详解:从使用到模拟实现

从标准输入读取一行,输出最后一个单词的长度。int main()// 用getline读取整行,不能用cin>>(遇空格就停了)// rfind从后往前找空格// 最后一个单词的长度 = 总长度 - 空格位置 - 1return 0;rfind(' ')返回最后一个空格的位置。如果字符串是"hello world",rfind返回5,长度就是,正好是"world"的长度。这篇文章从使用到原理,系统地讲解了C++的string核心知识点回顾C语言字符串的缺陷催生了string。

2026-06-05 11:01:24 220

原创 C语言文件操作完全指南

本文介绍了C语言文件操作的核心概念和使用方法。主要内容包括: 文件的作用:实现数据持久化存储,解决程序退出后数据丢失的问题 文件分类:程序文件和数据文件,重点讨论数据文件 文件类型:文本文件(ASCII存储)和二进制文件(原始数据存储)的区别 文件操作基础: 流(Stream)的概念和三个标准流(stdin/stdout/stderr) 文件指针FILE*的含义 使用fopen和fclose进行文件的打开关闭 文件读写方法: 字符读写(fgetc/fputc) 行读写(fgets/fputs) 格式化读写(

2026-05-31 10:06:09 321

原创 C语言字符函数和字符串函数完全指南

到这里,12个函数都讲完了。最后帮你梳理一下,方便记忆和复习。

2026-05-31 09:50:22 190

原创 深入理解指针(2):C语言指针进阶

回调函数是通过函数指针调用的函数。你把一个函数的地址传给另一个函数,后者在特定时机通过指针来调用前者,这个被调用的函数就是回调函数。回调函数不是由实现方直接调用,而是在特定事件或条件发生时由另一方调用。字符指针:存的是字符串首字符地址,多个指针可能指向同一块常量内存数组指针是指向数组的指针,注意与指针数组区分二维数组传参:本质是传递第一行的地址,类型是数组指针函数指针,可用于实现回调函数和转移表回调函数:通过函数指针实现代码复用,分离流程与实现qsort:利用回调函数实现通用排序,关键是。

2026-05-30 16:58:23 330

原创 C++模板初阶:泛型编程的第一步

学C++有一段时间了,你可能遇到过这样的情况:写了一个Swap函数交换两个整数,后来又要交换double,再后来又要交换char……每次都得重写一遍,代码越来越长,维护起来也头疼。有没有办法写一次就能适用于所有类型呢?答案就是模板。模板是C++实现泛型编程的核心机制。简单说,就是写一套代码,让编译器根据不同的类型自动生成对应的版本。这不仅减少了重复代码,还能提高代码的可维护性和安全性。这篇文章适合刚接触C++模板的初学者。我会从最基础的概念讲起,配合大量代码示例,带你理解函数模板和类模板的基本用法。

2026-05-29 20:26:47 467

原创 STL 标准模板库入门指南

STL 全称 Standard Template Library(标准模板库),是 C++ 标准库的重要组成部分。它的定位可以用一句话概括:STL 不仅是一个可复用的组件库,更是一个包罗数据结构与算法的软件框架。可复用的组件库:提供了容器、迭代器、算法等现成的工具,直接拿来用数据结构与算法的软件框架:把数据(容器)和操作(算法)解耦,通过迭代器连接,形成一套统一的设计范式这种设计让 STL 具有高度的通用性和扩展性。你可以用同一套算法(如sortfind)处理不同的容器(如vectorlist。

2026-05-26 21:09:18 383

原创 内存管理深度解析

int main()// malloc 只分配内存,不调用构造函数// new 分配内存 + 调用构造函数free(p1);// 不调用析构函数delete p2;// 调用析构函数 + 释放内存// 数组版本同理free(p5);// 10 个对象的析构函数都不会被调用!// 依次调用 10 次析构函数 + 释放内存return 0;用 malloc 申请自定义类型空间是危险的。

2026-05-26 21:01:34 484

原创 栈以及队列的详细讲解

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头在这里我们先定义一个结构体用于表示队列中的节点}QueueNode;然后我们再定义一个结构体用于表示这个队列//队头指针//队尾指针int size;//表示队列中有多少个元素}Queue;//初始化//入队//出队//返回队头元素//返回队尾元素//返回队列的大小。

2026-05-24 16:54:19 188

原创 C++类和对象完全指南(下

如果一个类定义在另一个类的内部,就叫内部类class Apublic:class B // 内部类public:// OK,B默认是A的友元private:int _h = 1;它是一个独立的类,外部类对象中不包含内部类(sizeof(A)不包含 B 的大小)内部类默认是外部类的友元,可以访问外部类的私有成员内部类受外部类的类域和访问限定符限制用类型(实参)定义出来的对象叫匿名对象A aa1;// 有名对象A();// 匿名对象A(1);// 带参的匿名对象。

2026-05-20 19:38:51 386

原创 C++类和对象完全指南(上

用class关键字定义类,后面跟类名,花括号里写成员,类定义结束时后面的分号不能省略class Datepublic:_day = day;int _month;int _day;// 分号!成员变量(属性):存储数据的变量成员函数(方法):操作数据的函数关于成员变量的命名,有个惯例:在变量名前面加或者后面加,或者用m开头,比如_yearyear_m_year。这不是C++语法强制要求的,但实际开发中几乎所有人都这么做,主要是为了和函数参数区分开。

2026-05-20 19:37:39 390

原创 C语言编译链接与预处理深度解析

_FILE__ // 当前源文件名__LINE__ // 当前行号__DATE__ // 编译日期(字符串)__TIME__ // 编译时间(字符串)__STDC__ // 如果编译器遵循ANSI C,值为11000#define PI3.14159注意:不要在末尾加分号!// 错误1000;// 使用时max = MAX;// 展开为 max = 1000;;出现两条语句,编译错误elsemax = 0;括号很重要!

2026-05-19 16:59:15 394

原创 C语言内存管理深度解析:从内存函数到动态内存分配

C99标准引入的特性:结构体的最后一个元素可以是未知大小的数组。int i;int a[0];// 柔性数组成员(某些编译器可能不支持,可写成 int a[];申请检查:每次malloc/calloc/realloc后都要检查返回值是否为NULL配对使用:malloc/free要配对使用,避免内存泄漏和重复释放释放后置空:free后将指针置为NULL,防止悬空指针避免越界:严格遵守分配的内存大小,不越界访问从起始释放:free时必须传入malloc返回的原始地址C语言的内存管理是一把双刃剑。

2026-05-19 10:50:12 361

原创 C语言自定义类型详解:结构体、联合体与枚举

C语言除了提供基本数据类型(如int、char、float等)外,还允许用户自定义数据类型。自定义类型包括结构体(struct)联合体(union)和枚举(enum),它们是构建复杂程序的重要工具。本文将系统讲解这三种自定义类型的声明、使用、内存布局以及最佳实践。结构体的声明、初始化和内存对齐规则位段的概念和使用场景联合体的特点和内存共享机制枚举的优势和使用方法位段(Bit-field)允许按位分配内存,节省空间。成员必须是intsigned int(C99也支持char等)

2026-05-17 16:44:01 354

原创 数据在内存中的存储深度解析

在C语言编程中,理解数据在内存中是如何存储的,是掌握底层原理的关键。为什么负数要这样表示?为什么同样的二进制数据,用整数和浮点数解读会完全不同?为什么在不同机器上数据存储顺序可能不同?本文将深入讲解整数和浮点数在内存中的存储方式,包括原码、反码、补码的概念,大小端字节序,以及IEEE 754浮点数标准。通过大量练习题,帮助你彻底理解这些核心概念。整数的原码、反码、补码表示方法大小端字节序的概念和判断方法浮点数的IEEE 754存储标准各种类型转换和溢出问题的分析方法。

2026-05-17 16:28:50 385

原创 C语言内存函数

函数功能是否支持重叠头文件memcpy内存复制❌ 不支持<string.h>memmove内存复制(支持重叠)✅ 支持<string.h>memset内存初始化<string.h>memcmp内存比较<string.h>

2026-05-16 18:34:21 329

原创 深度理解指针基础(1)

通过取地址操作符拿到的地址是一个数值(如0x006FFD70),这个数值需要存储起来方便后期使用。存放地址值的变量就是指针变量。// 取出a的地址并存储到指针变量pa中return 0;指针变量也是一种变量,专门用来存放地址,存放在指针变量中的值都会被理解为地址。野指针:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。指针变量也是变量,是变量就有地址。那指针变量的地址存放在哪里?这就是二级指针。int a = 10;

2026-05-16 15:31:29 365

原创 从字符指针到回调函数

指针数组:存放指针的数组(如数组指针:指向数组的指针数组指针变量存放的是数组的地址,能够指向整个数组。下面哪个是数组指针?// p1是指针数组([]优先级高于*)// p2是数组指针(括号改变优先级)p先和结合,说明p是一个指针指针指向的是一个大小为10个整型的数组所以p是一个数组指针,指向一个数组注意[]的优先级高于,所以必须加上()来保证p先和结合。数组是存放相同类型数据的存储空间。函数指针数组就是存放函数指针的数组。// parr1是函数指针数组// 错误语法// 错误语法解析。

2026-05-15 15:13:09 406

原创 分支循环讲解

分支与循环是 C 语言逻辑构建的基石。通过合理嵌套这些结构,并结合操作符的巧妙运用,你可以写出逻辑严密且功能强大的程序。希望这篇总结能帮你夯实基础!

2026-04-27 17:14:24 329

原创 顺序表以及链表

LTNode;

2026-04-17 17:22:06 563

原创 Linux权限问题

• ⽬录的可执⾏权限是表⽰你可否在⽬录下执⾏命令。• 如果⽬录没有 -x 权限,则⽆法对⽬录执⾏任何命令,甚⾄⽆法 cd 进⼊⽬, 即使⽬录仍然有 -r 读权限(这个地⽅很容易犯错,认为有读权限就可以进⼊⽬录读取⽬录下的⽂件)• ⽽如果⽬录具有 -x 权限,但没有 -r 权限,则⽤⼾可以执⾏命令,可以 cd 进⼊⽬录。但由于没有⽬录的读权限• 所以在⽬录下,即使可以执⾏ ls 命令,但仍然没有权限读出⽬录下的⽂档。

2026-01-25 15:11:22 257

原创 C++基础学习

本文介绍了C++中的几个重要特性:1.命名空间(namespace)用于解决命名冲突问题,可以将变量、函数和类封装在独立作用域中;2.默认参数函数允许为参数指定缺省值,分为全缺省和半缺省两种形式;3.函数重载允许同名函数通过参数列表的不同实现多态行为;4.引用是变量的别名,与指针相比更安全但不可更改指向;5.inline内联函数可以避免函数调用开销,适合短小频繁调用的函数;6.nullptr专门用于表示空指针,解决了NULL可能导致的类型转换问题。这些特性共同增强了C++的灵活性和安全性。

2026-01-09 18:26:53 214

空空如也

空空如也

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

TA关注的人

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