- 博客(32)
- 收藏
- 关注
原创 【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令
本文详细介绍了C语言预处理中的高级用法,包括#和##运算符的使用场景和实例演示。#运算符用于将宏参数转换为字符串,#define PRINT(n)实现变量名和值的智能打印;##运算符用于符号粘合,通过GENERIC_MAX宏自动生成不同类型数据的最大值函数。文章还讲解了条件编译指令、头文件包含的两种方式及避免重复包含的方法,以及#undef和命令行定义等预处理技巧。通过大量代码示例,帮助读者深入理解这些预处理技术在实际编程中的应用价值。
2025-06-03 11:59:24
1418
原创 【C语言预处理详解(上)】--预定义符号,#define定义常量,#define定义宏,带有副作用的宏参数,宏替换的规则,宏和函数的对比
本文介绍了C语言预处理阶段的关键知识点。主要内容包括:1. 预定义符号(如__FILE__、__LINE__等)的使用方法;2. #define定义常量的语法及注意事项,特别强调了末尾不加分号的原因;3. #define定义宏的规则,重点讲解了宏参数加括号的必要性、带有副作用的参数问题以及宏替换的流程;4. 宏与函数的优劣对比,指出宏在类型无关性和执行效率上的优势,同时也分析其在调试和安全性上的不足。文章通过具体代码示例,帮助读者理解预处理指令的实际应用和潜在问题。
2025-06-03 11:59:12
1247
原创 【C语言编译与链接】--翻译环境和运行环境,预处理,编译,汇编,链接
本文系统讲解了C程序从源代码到可执行文件的完整编译过程。首先介绍了翻译环境(编译+链接)和运行环境的区别,重点剖析了翻译环境的四大阶段:1)预处理阶段处理宏定义、条件编译和头文件插入;2)编译阶段进行词法分析、语法分析和语义分析;3)汇编阶段将代码转为二进制指令;4)链接阶段解决多文件间的符号调用问题。文章通过GCC命令示例和具体代码演示了每个阶段的操作,特别强调了链接阶段对全局变量和函数调用的处理机制。最后简要说明了程序运行时的内存管理机制,为理解C程序的完整生命周期提供了清晰框架。
2025-05-31 09:21:03
1591
原创 【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件
本文主要介绍了C语言中文件操作的相关函数和概念,包括文件的顺序读写函数fwrite和fread、格式化字符串处理函数sprintf和sscanf、文件的随机读写函数fseek/ftell/rewind、文件缓冲区机制及fflush函数的使用。文章还详细讲解了文件更新模式("r+"、"w+"、"a+")的区别及应用场景,并提供了大量示例代码。最后强调在文件读写转换时需要注意刷新缓冲区或重新定位文件指针,以避免操作错误。这些内容为C语言文件操作提供了全
2025-05-31 09:20:25
1427
原创 【通关文件操作(上)】--文件的意义和概念,二进制文件和文本文件,文件的打开和关闭,文件的顺序读写
本文介绍了C语言中文件操作的基本概念和常用函数。主要内容包括:文件的意义(持久化存储数据)、文件类型(程序文件和数据文件)、文件名组成、二进制与文本文件的区别。重点讲解了文件的打开(fopen)和关闭(fclose)操作,以及顺序读写函数如fputc、fgetc、fputs、fgets、fprintf、fscanf等的使用方法。文章还介绍了流的概念、标准流(stdin/stdout/stderr)、文件指针FILE*的作用,以及错误检测函数feof和ferror的使用。通过代码示例演示了各函数的具体应用场景
2025-05-28 11:07:12
1355
原创 【C语言动态内存管理】--动态内存分配的意义,malloc和free,calloc和realloc,常见的动态内存的错误,动态内存经典笔试题分析,柔性数组,总结C/C++中程序内存区域划分
本文介绍了C语言中动态内存管理的关键知识点。主要内容包括:动态内存分配的意义,malloc和free函数的使用方法,calloc和realloc函数的特点,常见动态内存错误分析,以及柔性数组的概念与优势。文章通过代码示例详细讲解了各种动态内存函数的正确使用方法,并分析了典型错误案例。最后总结了C/C++程序内存区域的划分,包括栈区、堆区、静态区和代码段。本文旨在帮助读者掌握C语言动态内存管理的核心概念和实用技巧。
2025-05-26 09:59:30
1176
原创 【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
本文详细介绍了C语言中结构体类型的使用及其相关概念。首先,文章解析了结构体的声明、变量的创建和初始化,以及结构体的特殊声明和自引用。接着,深入探讨了结构体内存对齐的规则及其原因,并提供了修改默认对齐数的方法。此外,文章还讨论了结构体传参的最佳实践,建议传递结构体地址以减少系统开销。最后,介绍了结构体实现位段的概念、内存分配、跨平台问题及其应用和注意事项。通过这些内容,读者可以全面理解结构体在C语言中的使用及其优化技巧。
2025-05-24 08:14:20
1360
原创 【数据在内存中的存储】--整数在内存中的存储,大小端字节序和字节序判断,浮点数在内存中的存储
本文主要探讨了整数和浮点数在内存中的存储方式,以及大小端字节序的概念和判断方法。首先,整数在内存中以补码形式存储,补码的使用简化了符号位和数值位的处理,同时统一了加法和减法的运算。其次,文章详细介绍了大小端字节序的定义及其存在的原因,大小端模式主要影响多字节数据在内存中的存储顺序。通过多个练习,读者可以加深对字节序的理解,并学会如何编写程序来判断当前机器的字节序。最后,文章还讨论了浮点数在内存中的存储方式,根据IEEE 754标准,浮点数由符号位、指数位和有效数字位组成,并通过实例解析了浮点数的存储和读取过
2025-05-21 07:39:50
1637
原创 【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用
当有一块内存空间需要设置内容的时候,就可以使用memset函数,值得注意的是memset函数对内存单元的设置是以字节为单位的。如果要比较2块内存单元的数据的大小,可以使用 memcmp 函数,这个函数的特点就是可以指定比较长度memcmp 函数是通过返回值告知大小关系的。【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现。
2025-05-20 08:23:50
1147
2
原创 【C语言字符函数和字符串函数(二)】--strcmp,strstr的使用和模拟实现,strncpy,strncat,strncmp函数的使用,strock,strerror函数的使用
C++研发方向学习者📖。
2025-05-18 08:14:58
1523
2
原创 【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
C++研发方向学习者📖。
2025-05-17 08:57:55
1579
2
原创 【C语言指针超详解(四)】--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组,转移表
-之前我们学习了指针数组,指针数组是一种数组,数组中存放的是地址(指针)。那么这里的数组指针肯定就是一个指针变量了。int * pint;存放的是整形变量的地址,能够指向整形数据的指针。float * pf;存放浮点型变量的地址,能够指向浮点型数据的指针。那么数组指针变量应该就是:存放的是数组的地址,能够指向数组的指针变量。下面两串代码分别是什么其中的p1和p2又代表什么?1int* p1[10//这是一个指针数组//这里的p1是数组名2int(*p2)[10。
2025-05-11 10:28:30
1404
原创 【C语言指针超详解(三)】--数组名的理解,一维数组传参的本质,冒泡排序,二级指针,指针数组
-我们先来思考一下指针数组是指针还是数组呢?我们类比⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。那指针数组呢?那肯定就是存放指针的数组。指针数组的每个元素都是用来存放地址(指针)的。指针数组的每个元素都是地址,又可以指向一块区域。
2025-05-10 09:28:12
1239
原创 【C语言指针超详解(一)】--指针变量和地址,指针变量类型的意义,指针运算
-从前面的内容我们可以了解到,32位机器假设有32根地址总线,每根地址总线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。如果指针变量是用来存放地址的,那么指针变量的大小就得是4个字节的空间才可以,同理,如果是64位机器,指针变量的大小就是8个字节。--我们生活中的许多事情都离不开编号,比如我说我们刚开学想找到自己的宿舍,如果不知道宿舍的门牌号的话,就很麻烦了,而有了门牌号,我们就可以快速找到宿舍的地址。
2025-05-06 16:14:09
1295
2
原创 【C语言】--VS2022实用调试技巧
-bug本意是"昆虫"或者"虫子",现在一般指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。为什么bug一词会有这样意思的转变呢,这是因为世界上的第一个程序错误是由一只飞蛾引起的。--当我们发现程序中存在的问题的时候,那么我们就得找到问题所在并解决问题。这个找问题的过程就是调试了,英文名叫debug调试一个程序,首先也是最重要的就是承认出现了问题,
2025-05-03 20:31:21
1116
2
原创 【进阶】--函数栈帧的创建和销毁详解
函数调用堆栈是可以反馈函数调用逻辑的,我们可以清晰的观察到,是由invoke_main函数来调用main函数的 ,在此之间的我们就不过多的去考虑了,我们接下来直接从main函数的栈帧创建开始。--当函数每次被调用时,系统都会在栈上为该函数分配一块栈帧空间。--在C语言中,函数栈帧是指在函数调用过程中,在内存栈中为该函数分配的一块空间,用于存储函数的局部变量,参数,返回地址等信息。当我们理解函数栈帧的创建和销毁后,我们就可以更好的去解决这些问题,如同修练自己的内功,也方便在后期能搞懂更多的知识。
2025-05-01 23:58:41
1199
5
原创 【C语言操作符详解(二)】--结构成员访问操作符,操作符的属性,表达式求值
代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2代码2:初始化struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化代码3:嵌套初始化struct Peoint age;//可以存放100个人的消息int count;//当前已存的个数int mian()//结构体嵌套初始化return 0;
2025-04-29 12:29:12
1313
原创 【C语言操作符详解(一)】--进制转换,原反补码,移位操作符,位操作符,逗号表达式,下标访问及函数调用操作符
目录一.操作符的分类二.二进制和进制转换2.1--2进制转10进制编辑 2.1.1--10进制转2进制数字2.2--2进制转8进制和16进制 2.2.1--2进制转8进制2.2.2--2进制转16进制 三.原码,反码,补码四.移位操作符4.1--左移操作符4.2--右移操作符五.位操作符:&,|,^,~5.1--位操作符的理解与使用5.2--相关练习5.2.1--练习1:不能创建临时变量(第三个变量),实现两个整数的交换。5.2.2--练习2:编写代码实现:求一个整数存储在内存中的二进制中1的个数5.2.
2025-04-27 20:28:27
1353
14
原创 【通关函数的递归】--递归思想的形成与应用
/main函数中⼜调⽤了main函数return 0;上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最后也会陷入死递归,导致栈溢出(stack overflow)。
2025-04-24 23:35:23
5993
8
原创 【趣味小游戏】--扫雷游戏
前面学习了数组和函数等c语言相关知识,这篇文章我们将通过这些知识分为三个文件来完成扫雷游戏;1.test.c //文件中写游戏的测试逻辑2.game.c //文件中写游戏中函数的实现等3.game.h. //文件中写游戏需要的数据类型和函数声明等。
2025-04-22 16:18:55
842
6
原创 【C语言函数部分的重要知识点】--自定义函数,static和extern
-函数一定要先声明再调用,这里只跟大家讲讲在多文件中该怎样操作;当然,函数的定义也是一种特殊的声明,所以如果函数定义放在调用之间也可以;一般我们会将函数的声明,类型的声明放在头文件.h中,函数的实现是放在.c文件中;补充:我这里最后test.c文件中还需要包含一个头文件add.h。
2025-04-20 13:47:02
1351
2
原创 【C语言数组通关秘籍】--一维数组,二维数组,简单的二分查找
上篇文章分享了两个趣味小游戏的代码实现,这篇文章将会给大家继续分享数组的相关知识~
2025-04-16 22:47:06
1167
2
原创 【趣味小游戏】--关机程序和猜数字小游戏
前面几篇文章分享了c语言的部分知识,这一篇文章让我们想利用前面所学内容来完成一个关机程序和猜数字小游戏吧·~
2025-04-14 23:57:53
1210
12
原创 【通关分支与循环(二)】---switch语句,while循环,for循环,do-while循环,break和continue语句
在上篇文章中我分享了if语句,关系操作符,条件操作符,逻辑操作符的知识;今天这篇文章我将接着分享switch语句,while循环,for循环,do-while循环,break和Continue语句等知识点;
2025-04-12 21:30:28
1405
6
原创 【通关分支与循环(一)】---if语句,关系操作符,条件操作符,逻辑操作符
-那么什么时候会用上该语句呢,举个例子,比如我们如果要判断一个数是不是奇数,那么我们用if语句就够了,那要是我们需要判断一个数是奇数还是偶数呢,这个时候就需要if……这个代码的结果会是是都不输出,你们想对了嘛,这就是悬空else问题,else总和最接近的if匹配,从这其实我们可以看出大括号的重要性,如果这里带上大括号,那么是不是就会条理清晰很多呢。但我们会发现有些问题光靠一个if语句无法判断,于是有了else语句和if语句的组合使用,if的嵌套等等,这些知识点都会在接下来讲到的。
2025-04-08 19:45:17
1520
14
原创 Scanf的一些重要知识点
--scanf()的返回值是一个整数,表示成功读取变量的个数,如果没有读取任何项或者匹配失败,则返回0;如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)--end of file 文件结束标志。--有时,我们的输入可能不符合预定的格式。如下图所示,如果用户输入2025-04-07,会正确的解读出来,但如果用户输入其他格式,就会解读失败。---scanf()和printf()的占位符基本一致,下图中是几个常用的;---scanf()和printf()的语法相似。
2025-04-07 23:56:13
862
4
原创 printf的部分知识点分享
从上图中可以看出,%5d表示这个占位符的宽度至少5位,如果不满5位,对应的值前面会添加空格,默认是右对齐;结语:关于printf的知识分享就到这里了,后续还会更新scanf以及其他c语言知识的分享,感兴趣的朋友们可以关注一下~另外欢迎在评论区中提出自己的观点,让我们一起探讨进步。可以用%.[m]s来指定输出的长度,其中的m表示一个数字,表示要输出的长度为几。---默认情况下,printf()不对正数显示+号,只对负数显示-号,如果想让整数也输出+号,可以在占位符%d前面加一个+号。需要保留3位,就写成。
2025-04-05 12:20:54
1136
4
原创 C语言常见概念及数据类型和变量的一些重要知识点
1.大写字母A~Z的Ascll码值是65·90 2.小写字母a~z的Ascll码值是97~1203.大写字母和小写字母Ascll码值的差值为32 4.数字0~9的Ascll码值是48~575.\n的Ascll码值是10 6.在这些字符中的Ascll码值从0~31这32个字符不可打印在屏幕上观察二. \0 字符及\ddd \xdd这两个转义字符。
2025-04-03 23:17:46
1446
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人