- 博客(46)
- 收藏
- 关注
原创 数组与特殊压缩矩阵
访问:O(1)(对称/三角)或 O(non_zero)(稀疏矩阵遍历)针对特定规律的矩阵(如对称、稀疏),可通过压缩存储减少空间占用。:类似对称矩阵,但需额外存储剩余部分的常量(如0)。:需手动实现(如科学计算中的Fortran风格)。:绝大多数元素为0,通过压缩存储非零元素。:适合频繁插入/删除操作(如图像处理)。:对称矩阵用于物理模拟中的刚度矩阵。(C语言默认):元素按行连续存储。:稀疏矩阵存储图像的非零像素。:只存储主对角线及以上元素。:只存储主对角线及以下元素。:存储非零元素的行、列、值。
2025-04-02 07:43:09
361
原创 带头结点和不带头结点
适用于对内存敏感的场景,或已知链表操作不会频繁修改头部的情况。简化代码逻辑,适合频繁在头部插入/删除的场景(如栈的实现)。头结点始终存在,插入操作无需修改头指针,只需操作头结点的。删除第一个数据结点时,只需操作头结点的。插入到链表头部时需修改头指针,需传递。链表的第一个结点直接存储有效数据。,不存储有效数据,仅作为辅助结点。删除第一个结点时需修改头指针。头指针始终指向头结点,头结点的。)直接指向第一个数据结点。指向第一个数据结点。
2025-03-31 11:23:46
400
原创 C语言为什么不考虑对齐规则?
C语言不强制对齐:为了兼容不同硬件、保留程序员的控制权。实际对齐由编译器实现:默认按平台最优方式处理,程序员可覆盖默认行为。手动控制对齐的场景:网络协议解析、硬件寄存器映射、内存敏感型应用。核心原则:C语言将对齐视为“实现细节”,而非语言规范的一部分,以此保持底层编程的灵活性和高效性。
2025-03-24 09:26:47
457
原创 C语言中*a与&a的区别和联系
&a:获取变量地址,生成指针。*a:访问指针指向的值,要求 a 必须是指针。核心区别:&a 是从数据到指针(值 → 地址)。*a 是从指针到数据(地址 → 值)。联合使用场景:多级指针、函数参数传递、动态内存管理等。
2025-03-23 13:24:35
516
原创 指针中*的位置
历史与社区差异C 语言传统:更倾向 int *p,强调 * 的操作符属性。C++ 倾向:部分开发者偏好 int* p,强调类型系统。现代 IDE 支持:代码高亮和类型提示降低了风格争议的重要性。总结语法正确性:两种写法均合法,编译器处理结果相同。可读性优先:根据团队规范选择风格,避免歧义写法。关键原则:清晰表达意图,尤其在多指针声明和 const 修饰时。
2025-03-20 08:15:21
393
原创 C语言中malloc、calloc与realloc
目录一、malloc(Memory Allocation)二、calloc(Contiguous Allocation)三、realloc(Reallocate Memory)四、关键对比表五、使用注意事项六、典型应用场景(*)七、扩展知识功能:分配指定字节数的未初始化内存语法:特点:分配的内存内容是未初始化的(可能包含随机值)参数为字节数(需手动计算元素大小)适用于需要精确控制内存大小的场景示例:二、(Contiguous Allocation)功能:分配指定数量和大小的内存,并初始化为
2025-03-18 08:05:03
892
原创 C语言调用api
类型匹配:注意Windows的DWORD、HANDLE等特殊类型。内存管理:某些API需要手动释放资源(如CloseHandle)版本兼容性:注意不同系统版本API的差异。调用约定:Windows API多使用。(__stdcall),普通C函数使用。考虑使用跨平台库(如Boost、Qt)Windows: 显式链接库(如。Linux: 一般自动链接标准库。线程安全:注意API是否线程安全。使用现代API替代已弃用的函数。Windows API多使用。Linux: 对应头文件如。对系统相关代码进行条件编译。
2025-03-17 07:02:34
344
原创 网络通信两台机器
云服务器(如 AWS EC2)运行服务端程序。开放安全组的入站端口(如TCP 8080)1. 服务端(远程机器)2. 客户端(本地机器)2. 测试网络连通性。3. 处理多网卡场景。
2025-03-16 11:35:21
302
原创 Socket实现网络编程Windows系统
(Sysinternals):实时查看Socket连接。解决:添加Windows防火墙例外规则。:跟踪Socket API调用。现象:程序多次运行后资源耗尽。:查看进程的Socket句柄。现象:Socket函数返回。解决:确保程序启动时调用。1. TCP 服务端。2. TCP 客户端。现象:客户端无法连接。
2025-03-15 11:54:41
366
原创 文件的打开及关闭
打开文件 FILE *fopen(const char *filename, const char *mode);功能:建立程序与文件的连接通道参数:filename:文件路径(绝对/相对路径)mode:打开模式(决定读写权限和文件处理方式)返回值:成功:返回 FILE 结构指针(文件流指针)失败:返回 NULL2. 关闭文件 int fclose(FILE *stream);功能:断开程序与文件的连接关键作用:刷新缓冲区(确保数据写入磁盘)释放系统资源(文件描
2025-03-14 06:15:14
622
原创 文件操作原理
文件模型:操作系统将物理存储抽象为线性字节序列文件类型:普通文件/目录/设备文件/符号链接等文件描述符(Linux)或句柄(Windows):进程访问文件的凭证标准操作接口:创建/删除 create/unlink打开/关闭 open/close读/写 read/write定位 seek元数据操作 stat/chmod。
2025-03-13 13:50:25
733
原创 函数调用汇编
每个函数调用时在栈上分配的内存块,保存返回地址、参数、局部变量等。是右到左)、栈清理责任(调用者或被调用者清理)。: 指向下一条要执行的指令(不可直接修改)。2. 被调用函数 (Callee) 建立栈帧。1. 调用者 (Caller) 准备参数。:递归过深或局部变量过大导致栈破坏。: 基址指针,标记当前栈帧的起点。规定参数传递顺序(如。未清理栈,引发崩溃。
2025-03-13 13:50:11
536
原创 变量赋值汇编
使用调试工具:通过GDB或OllyDbg观察赋值过程对比C代码:编写简单C程序,用gcc -S生成汇编代码注意架构差异:x86使用MOV内存到寄存器需要显式操作,ARM需要LDR/STRint a = 10;int b = a;return 0;a = 10将a的值加载到eaxb = eax中的值高级语言的变量赋值本质上是通过寄存器中转,在内存和CPU之间传递数据的过程。
2025-03-12 09:34:27
527
原创 选择循环汇编
核心逻辑:比较条件:用 CMP 指令条件跳转:用 JE(等于跳转)、JNE(不等于跳转)、JG(大于跳转)等代码块分割:通过标签(如 label1:)标记不同分支
2025-03-12 09:34:17
401
原创 汇编指令格式
C 代码通过编译器(如 GCC)转换为汇编指令,最终生成机器码。汇编是 C 和机器码之间的桥梁,直接操作寄存器、内存和 CPU 指令。
2025-03-11 06:30:00
680
原创 浮点数IEEE754标准
IEEE 754 将浮点数分为三个部分存储:符号位(Sign) + 指数(Exponent) + 尾数(Mantissa/Fraction)
2025-03-10 06:30:00
910
原创 浮点数精度丢失
计算机用存储浮点数,而人类常用的是十进制。某些十进制小数无法精确转换为二进制,就像 1/3 在十进制中无法精确表示(0.3333...)一样。
2025-03-10 06:30:00
1318
原创 整型的不同类型和溢出
决定整数能表示的范围(如1字节=8位byte(1字节)、short(2字节)、int(4字节)、long(8字节)。:支持正负值,最高位为符号位。int的范围是到(4字节)。:仅支持非负值,所有位用于表示数值。的范围是0到(4字节)。当整数超出其类型能表示的范围时,会发生溢出。不同语言对溢出的处理方式不同。假设一个4字节有符号整数-2^31到2^31-1):(二进制,但会溢出为(二进制。
2025-03-09 11:14:31
335
原创 Python笔记(简单版)
参数可以设置默认值,调用时可不传。不用声明类型,直接写名字和值。表示代码属于哪个块。:遍历列表、字符串等。:条件满足时重复执行。
2025-03-09 11:13:34
344
原创 C/S架构与B/S架构
C/S架构(Client/Server,客户端/服务器)客户端需安装专用软件(如QQ、企业ERP系统),直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点:客户端承担部分计算任务,响应速度快;但依赖特定环境,跨平台能力弱。B/S架构(Browser/Server,浏览器/服务器)用户通过浏览器(如Chrome、Edge)访问服务,无需安装额外客户端。服务器集中处理业务逻辑和数据存储(如网页邮箱、在线文档)。特点:跨平台性强,维护成本低;但依赖网络性能,复杂计算能力较弱。
2025-03-08 12:39:36
748
原创 网页404错误的原因
用户手动输入错误或拼写有误(如路径、文件名错误)。:检查URL是否正确,修正拼写或路径。资源被删除、重命名或迁移后未设置重定向。:恢复页面或设置301/302重定向到新位置。文件路径错误、.htaccess配置不当或未启用模块(如Apache的:检查服务器配置文件,确保路径和重定向规则正确。网站内存在过时或错误的内部链接。:定期检查并修复内部链接,使用工具(如死链检测器)扫描。内容管理系统(如WordPress)中伪静态规则未正确配置,或动态路由失效。:检查CMS的固定链接设置或路由规则。
2025-03-08 06:30:00
342
原创 二维数组与二级指针
行为类似二维数组,但内存是动态分配的。正确做法:使用指向数组的指针。行长度可不同,但内存不连续。需指定列数(第二维长度)编译器自动计算偏移量。(实际是数组的数组)
2025-03-06 07:00:00
258
原创 switch和do while
2. 核心规则 表达式:必须是 整型 或 枚举类型(如 , )。case:后跟常量表达式(如 , ),用于匹配 的值。break:跳出 ,若省略会导致“贯穿”(fall-through)执行后续 。default:当所有 都不匹配时执行(可选)。4. 常见用途 菜单选择(如用户输入选项)。状态机实现。替代多重 结构,提升可读性。贯穿现象:若忘记 ,会继续执行下一个 的代码:二、 循环:先执行,后判断1. 语法结构2. 核心规则 先执行循环体,再
2025-03-04 07:00:00
337
原创 按位运算符与移位运算符
1. 按位与(&)规则:两位都为1时结果为1,否则为0。用途:提取特定位、掩码操作。2. 按位或(|)规则:两位中有一个为1则结果为1。用途:设置特定位。
2025-03-03 07:00:00
543
原创 自增自减运算符
++a:先对变量 a 加1,再使用 a 的值。--a:先对变量 a 减1,再使用 a 的值。a++:先使用 a 的当前值,再对 a 加1。a--:先使用 a 的当前值,再对 a 减1。
2025-03-02 07:00:00
477
原创 条件运算符与逗号运算符
条件运算符是C语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑与运算符就是双目运算符;单目运算符代表有一个操作数,如逻辑非运算符就是单目运算符。运算符也称操作符,三目运算符通过判断问号之前的表达式的真假,来确定整体表达式的值,如下例所示:如果a>b为真,那么三目表达式整体的值为 a,所以max 的值等于a,如果 a>b为假、那么三目表达式整体的值为b,所以 max的值等于 b。逗号运算符的优先级最低,我们需要掌握的是,逗号表达式的整体值是最后一个表达式的值。
2025-03-01 12:42:50
450
原创 王道C语言笔记(高级阶段:组层原理数据表示与汇编实战&操作系统文件部分的算法)
条件运算符是C语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑与运算符就是双目运算符;单目运算符代表有一个操作数,如逻辑非运算符就是单目运算符。运算符也称操作符,三目运算符通过判断问号之前的表达式的真假,来确定整体表达式的值,如下例所示:如果a>b为真,那么三目表达式整体的值为 a,所以max 的值等于a,如果 a>b为假、那么三目表达式整体的值为b,所以 max的值等于 b。
2025-02-27 07:00:00
1168
原创 归并排序(Merge sort)
首先,最小下标值和最大下标值相加并除以 2,得到中间下标值mid,用MergeSort对low到mid 排序,然后用MergeSort对 mid+1到high排序,当数组的前半部分和后半部分都排好序后,使用Merge 函数.Merge函数的作用是合并两个有序数组。首先,我们通过循环把数组A中从low到high的元素全部复制到B中,这时游标i(遍历的变量称为游标)从low开始,游标j从mid+1开始,谁小就将谁先放人数组A对其游标加 1,并在每轮循环时对数组的计数游标k加1。
2025-02-26 07:00:00
721
原创 堆排序(Heap Sort)
这里采用层次建树法,虽然只用一个数组存储元素,但是我们能将二叉树中任意一个位置的元素对应到数组下标上,我们将二叉树中每个元素对应到数组下标的这种数据结构称为堆,比如最后一个父元素的下标是N/2-1,也就是a[41,对应的值为78为什么是N/2-1?因为这是层次建立一棵完全二叉树的特性。 可以这样记忆:如果父结点的下标是dad,那么父结点对应的左子结点的下标值是2*dad+1。接着,依次将每棵子树都调整为父结点最大,最终将整棵树变为一个大根堆。
2025-02-25 07:00:00
793
原创 插入排序(Insertion Sort)
接着,将数值2插人有序序列,首先将2 赋给 insertVal,这时判断87 是否大于 2,因为87 大于2,所以将87 向后移动,将2 覆盖然后判断3是否大于2,因为3大于2,所以3移动到87 所在的位置, 内层循环结束,这时将2赋给 arr[0]的位置,得到下表中第2次插入后的效果。首先,我们通过外层循环控制要插人的数,用insertVal保存要插入的值 87,我们比较 an[0]是否大于ar[1],即3是否大于 87,由于不大于,因此不发生移动,这时有序序列是3,87;
2025-02-24 07:00:00
339
原创 选择排序(Selection Sort)
选择排序虽然减少了交换次数,但是循环比较的次数依然和冒泡排序的数量是一样的,都是从1加到N-1,总运行次数为N(N-1)/2.我们忽略循环内语句的数量,因为我们在计算时间复杂度时,主要考虑与N有关的循环,如果循环内交换得多,例如有5条语句,那么最终得到的无非是5n2;首先假定第零个元素是最小的,把下标0赋值给min(min 记录最小的元素的下标),内层比较时,从1号元素一直比较到9号元素,谁更小,就把它的下标赋给min,一轮比较结束后,将min 对应位置的元素与元素i交换,如下表所示。假设排序表为L[1…
2025-02-24 06:30:00
403
原创 快速排序(Quick Sort)
因为数组本身从小到大有序时,如果每次我们仍然用最左边的数作为分割值,那么每次数组都不会二分,导致递归n次,所以快速排序最坏时间复杂度为n的平方,当然,为了避免这种情况有时会首先随机选择一个下标,先将对应下标的值与最左边的元素交换,再进行partition 操作从而极大地降低出现最坏时间复杂度的概率,但是仍然不能完全避免因此快排最好和平均时间复杂度是 O(nlog2n),最差是 O(n2)。
2025-02-23 07:00:00
472
原创 冒泡排序(Bubble Sort)
时间复杂度其实就是程序实际的运行次数,可以看到内层是>i,外层i的值是从0到N-1,所以程序的总运行次数是1+2+3+…+(N-1),即从1 一直加到N-1,这是等差数列求和,得到的结果是N(N-1)/2,即总计运行了这么多次,忽略了低阶项和高阶项的首项系数,因为时间复杂度为(㎡)。..这样最多做n-1趟冒泡就能把所有元素排好序。首先我们通过随机数生成10个元素,通过随机数生成,我们可以多次测试排序算法是否正确,然后打印随机生成后的元素顺序,然后通过冒泡排序对元素进行排序,然后再次打印排序后的元素顺序。
2025-02-22 07:00:00
620
原创 二分查找(Binary Search)
折半查找的基本思想: 首先将给定值key与表中中间位置的元素比较,若相等,则查找成功,返回该元素的存储位置; 若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分(例如,在查找表升序排列时,若给定值key大于中间元素,则所查找的元素只可能在后半部分), 然后在缩小的范围内继续进行同样的查找,如此重复,直到找到为止,或确定表中没有所需要查找的元素则查找不成功,返回查找失败的信息。
2025-02-21 20:27:42
651
原创 二叉树的遍历(前序、中序、后序及其层次遍历)
先序遍历:根 -> 左 -> 右中序遍历:左 -> 根 -> 右后序遍历:左 -> 右 -> 根层次遍历:从上到下、从左到右。
2025-02-10 17:52:46
485
AI领域DeepSeek-R1对话模型的创新使用方法与实用技巧
2025-02-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人