- 博客(20)
- 收藏
- 关注
原创 从源码到可执行文件:C语言编译、链接与预处理完整拆解
本文介绍了C语言程序的编译、链接和预处理过程。编译分为预处理、编译和汇编三个阶段,链接将目标文件合并为可执行文件。预处理阶段处理预定义符号、宏定义和条件编译等内容。文章详细讲解了#define定义常量和宏的方法,对比了宏与函数的优缺点,介绍了#和##运算符的使用。还说明了条件编译指令、头文件包含方式及防止重复包含的方法。通过本文可以全面了解C语言从源代码到可执行文件的转换过程及预处理阶段的各种特性。
2026-05-17 15:31:36
337
原创 C语言文件操作:从流到文件指针,你真的理解fopen/fclose吗?
本文系统讲解了C语言文件操作的核心知识。首先介绍了文件的基本概念和分类(文本/二进制文件),重点解析了流机制如何屏蔽设备差异,通过缓冲区提高效率。详细讲解了文件指针FILE*、标准流(stdin/stdout/stderr)和缓冲模式。随后深入剖析了文件打开关闭函数(fopen/fclose)的使用方法和注意事项,以及顺序读写(fgetc/fputc等)和随机读写(fseek/ftell)的实现原理。最后通过一个文件拷贝的完整示例,演示了如何综合运用这些知识进行实际文件操作。
2026-05-16 12:11:17
306
原创 深入浅出C动态内存:从malloc到free,一篇文章彻底搞懂
本文介绍了C语言中动态内存管理的核心概念和操作。首先阐述了动态内存管理的必要性,指出其在处理未知数据量时的关键作用。然后详细讲解了程序内存分区,重点介绍了堆区的动态内存管理。文章系统讲解了四大核心函数:malloc分配未初始化空间、calloc分配初始化为0的空间、realloc调整内存大小以及free释放内存,并提供了具体使用示例和注意事项。最后总结了常见错误,包括空指针判断、越界访问、多次释放和内存泄漏等问题,并补充介绍了柔性数组的概念和使用方法。掌握这些知识是编写灵活、健壮C程序的基础。
2026-05-12 19:36:04
378
原创 C语言-自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举。结构体部分详细讲解了声明方式(包括匿名结构体和自引用)、内存对齐规则(包括对齐数计算和嵌套结构体处理)以及位段的使用方法。联合体部分阐述了其与结构体的区别,即所有成员共享内存空间,并说明了大小计算规则。枚举部分介绍了其声明语法和使用场景,强调了枚举在增强代码可读性和调试便利性方面的优势。全文通过具体示例展示了这些自定义类型的实际应用,帮助读者深入理解其特性和使用方法。
2026-05-08 20:32:50
376
原创 C语言-内存函数和数据在内存中的存储
本文摘要: 介绍了C语言中常用的内存操作函数(memcpy/memmove/memset/memcmp)及其参数用法,重点分析了数据在内存中的存储方式。整数以补码形式存储,存在大小端字节序问题;浮点数按IEEE 754标准存储,包含符号位S、有效数字M和指数E,解释了浮点数精度损失的原因(如9.2无法精确表示为二进制)。通过实例展示了9.5的二进制转换和存储过程,说明了不同类型数据在内存中的存储机制及可能存在的精度问题。
2026-05-06 12:27:09
340
原创 C语言-字符函数和字符串函数
本文介绍了C语言中常用的字符处理函数和字符串操作函数。字符函数需要包含<ctype.h>头文件,包括字符分类函数(如isdigit、isalpha等)和转换函数(tolower、toupper)。字符串函数需要包含<string.h>头文件,主要包含字符串处理函数:strlen获取长度、strcpy/strcat复制拼接字符串、strcmp比较字符串、strstr查找子串、strtok分割字符串,以及错误处理函数strerror和perror。这些函数为C语言提供了基础的字符和字符串
2026-04-28 20:57:08
356
原创 C语言-指针(终)
本文总结了指针学习的最后部分内容:1. 回调函数是通过函数指针调用的函数,将一个函数地址传给另一个函数并在适当时机调用;2. qsort快速排序函数的用法,重点是其通过函数指针参数实现自定义比较规则;3. 指针补充知识,包括字符串指针、二维数组指针表示等注意事项;4. 强调指针学习至此结束,鼓励提出疑问。全文概括了指针核心概念和常见用法,为后续编程实践奠定基础。
2026-04-25 19:43:38
158
原创 C语言-指针(四)
本文摘要: 本文系统介绍了C语言中几种重要指针类型的使用方法。首先讲解字符指针变量,包括指向单个字符和字符串的用法;其次分析数组指针变量与指针数组的区别;然后深入解析二维数组传参的本质,指出二维数组名实际上是数组指针;接着介绍函数指针变量的定义和使用方法;最后讲解typedef关键字在简化复杂指针声明中的应用。全文通过代码示例详细阐述了各种指针类型的语法特点和使用场景,特别对二维数组和函数指针等复杂概念进行了重点剖析。
2026-04-22 15:35:16
348
原创 C语言-指针(三)
本文讲解了指针的几个重要概念:1. 数组名的理解:数组名通常表示首元素地址,但在sizeof和&操作时例外;2. 一维数组传参本质:传递的是指针而非整个数组,无法在函数内计算元素个数;3. 二级指针:指向指针变量的指针,通过双重解引用访问原始变量;4. 指针数组与数组指针的区别:指针数组是存放指针的数组,数组指针是指向数组的指针;5. 用指针数组模拟二维数组的方法。文章还介绍了数组访问的底层实现和指针运算的应用。
2026-04-20 21:13:42
362
原创 C语言-指针(二)
本文介绍了C/C++中const修饰指针的两种方式:当const放在*左边时限制指针指向的值不可修改,放在右边时限制指针本身不可修改。同时讲解了野指针的成因及规避方法,包括初始化指针、避免越界访问等。还介绍了assert断言的使用技巧,能有效调试指针有效性检查。最后对比了传值调用和传址调用的区别,通过指针参数才能真正修改主调函数中的变量值。这些知识点对理解指针操作和函数参数传递机制具有重要意义。
2026-04-18 14:45:52
315
原创 C语言-指针(一)
本文摘要: 指针是C语言中表示内存地址的变量,通过int *p等类型声明。指针变量存储其他变量的地址,使用&取地址操作符获取地址,*解引用操作符访问指向的值。指针大小由系统决定(32位4字节,64位8字节),但类型决定其步长和解引用范围(如int*操作4字节)。指针运算包括加减整数(按类型步长移动)、指针相减(计算元素间隔)及关系比较。void*为泛型指针,但无法直接运算或解引用。理解指针类型对内存操作和地址计算至关重要。
2026-04-16 21:43:18
192
原创 C语言-操作符详解
本文系统介绍了C语言中的各类操作符及其应用,重点讲解了移位操作符、位操作符、逗号表达式和结构成员访问操作符的使用方法。详细阐述了进制转换原理、原码/反码/补码的概念及计算机采用补码存储的原因。通过实例说明了整型提升和算术转换机制,强调操作符优先级和结合性对表达式求值的影响。文章还介绍了结构体的定义与使用,以及如何通过结构成员访问操作符操作结构体成员变量。
2026-04-11 17:14:31
371
原创 C语言-函数递归
本文介绍了函数递归的概念与应用。递归是指函数直接或间接调用自身,需要设置限制条件避免死循环和栈溢出。递归通过将复杂问题分解为相似的小问题来简化求解,如计算阶乘时通过Fac(n)=Fac(n-1)*n实现。虽然递归代码简洁但效率较低,会消耗栈空间;而迭代效率高但可能较难实现。建议在问题复杂度高且递归能显著简化代码时使用递归,但需注意递归深度控制。文中通过阶乘计算对比了递归和迭代的实现方式,帮助理解递归思想。
2026-04-08 17:02:40
172
原创 汇编语言-寄存器(二)
本文主要介绍了8086CPU的段机制和寄存器功能。内存本身不分段,分段源于CPU通过"段地址×16+偏移地址"计算物理地址的方式,允许程序员灵活划分内存段。8086CPU有4个段寄存器(CS、DS、SS、ES),其中CS(代码段寄存器)和IP(指令指针寄存器)最为关键,共同指向当前执行的指令地址。CPU通过CS:IP读取指令并执行,开机时默认从FFFF0H读取第一条指令。修改CS和IP需使用jmp转移指令,而其他寄存器可用mov指令修改。文章还说明了代码段的定义方式,强调段地址必须为16
2026-04-02 16:17:51
327
原创 C语言-函数(二)
本文总结了函数中使用数组作为参数的关键要点:1) 数组作为参数时需要同时传递数组名和长度;2) 形参为一维数组时可省略大小,二维数组必须指定列数;3) 数组传参时形参和实参共享内存地址。文章还介绍了函数声明与定义的区别,多文件编程中头文件的使用方法,以及static关键字的三种用法:修饰局部变量可延长生命周期(存储在静态区而非栈区),修饰全局变量会限制其作用域(取消外部链接属性),修饰函数可限制外部调用。这些知识点对理解C语言中函数和变量的作用域与生命周期至关重要。
2026-03-30 20:40:02
303
原创 汇编语言-寄存器(一)
本文介绍了CPU的基本组成和工作原理,重点分析了8086CPU的寄存器结构。CPU主要由运算器、控制器、寄存器等部件通过总线连接构成,其中寄存器是程序员可直接操作的部件。8086CPU包含14个16位寄存器,包括4个可拆分为8位使用的通用寄存器(AX、BX、CX、DX)。文章详细说明了8086CPU采用段地址和偏移地址相加(段地址×16+偏移地址)的方法生成20位物理地址的过程,这种设计既保持了16位结构的兼容性,又实现了1MB内存寻址能力。同时还解释了字在寄存器中的存储方式以及相关的汇编指令操作。
2026-03-29 10:13:47
355
原创 C语言-函数(一)
文章摘要:函数分为库函数和自定义函数。库函数由编译器厂商根据C标准实现,可通过官方文档查询使用。自定义函数由返回值类型、函数名、形参和函数体组成,形参是实参的临时拷贝。return用于返回数值或表达式,void函数可写空return。需注意返回值类型转换和确保所有分支都有返回值,否则会编译错误。
2026-03-28 15:41:26
27
原创 汇编语言-基础知识
本文主要介绍了汇编语言的基本概念及其与计算机硬件的关系。汇编语言是机器指令的助记符,通过编译器转换为二进制机器码。CPU通过地址总线、数据总线和控制总线与存储器及其他设备交互,存储器分为RAM和ROM两类。汇编程序员需要理解内存地址空间的分配,这取决于CPU地址总线的宽度(如8086CPU的20位地址总线对应1MB内存空间)。文章还阐述了主板、接口卡等硬件组件的作用,以及汇编语言在计算机系统中的工作方式。
2026-03-27 15:09:33
377
原创 C语言-数组(二)
本文介绍了C语言中二维数组的相关概念。主要内容包括:二维数组的本质(一维数组的数组)、创建方式(如int arr[3][5])、初始化方法(完全/不完全初始化)、元素访问(行列下标从0开始)和内存存储特性(连续存放)。此外还介绍了C99标准引入的变长数组(可用变量指定大小),并指出MSVC编译器不支持该特性。这些内容为理解和使用二维数组提供了基础指导。
2026-03-26 23:53:15
25
原创 C语言-数组(一)
本文主要介绍了C语言中一维数组的基础知识,包括数组的定义、初始化、类型、大小计算和元素访问等。数组是存储同类型数据的容器,创建时需要指定长度和数据类型。文章详细说明了完全初始化和不完全初始化的区别,以及如何计算数组大小。此外,还讲解了数组元素的下标访问方式和内存地址特性,通过实例展示了数组元素在内存中的连续存储特性,为后续学习指针打下基础。
2026-03-25 22:43:15
39
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅