- 博客(53)
- 收藏
- 关注
原创 解锁 C 语言动态内存管理的核心技能
动态内存管理是C语言中一项强大而灵活的技术,但也需要谨慎使用。在使用动态内存分配函数时,要注意内存的分配和释放,避免出现内存泄漏、悬空指针和重复释放等错误。
2025-03-17 17:46:22
526
原创 探索 C 语言枚举类型的奇妙世界
枚举类型使用enumenum 枚举类型名 {枚举常量 1 , 枚举常量 2 , // 可以有更多的枚举常量 枚举常量n };枚举类型名:是自定义的枚举类型的标识符,用于后续声明该枚举类型的变量。枚举常量:是枚举类型中预定义的值,它们是整型常量,默认情况下,第一个枚举常量的值为0,后续的枚举常量的值依次递增1。在这个例子中,定义了一个名为Weekday的枚举类型,包含了一周七天的枚举常量。Monday的值默认为0,Tuesday的值为1,依此类推,Sunday的值为6。// 定义枚举类型。
2025-03-14 17:35:53
729
原创 C 语言联合体:内存空间的奇妙共享魔法
联合体的定义语法与结构体(struct)类似,使用union// 可以有更多成员 };其中,union_name是联合体的名称,data_type是成员的数据类型,member1member2等是联合体的成员名。// 定义一个联合体int i;float f;在这个例子中,定义了一个名为Data的联合体,它包含三个成员:一个整数i、一个浮点数f和一个字符数组str。
2025-03-11 12:01:35
776
1
原创 深度剖析 C 语言结构体:从基础到进阶
结构体的定义使用structstruct 结构体名 {数据类型 成员1;数据类型 成员2;// 可以有更多的成员int age;在这个例子中,Student是结构体名,和int、short、char等类型类似;它包含了三个成员:一个字符数组name用于存储学生的姓名,一个整数age用于存储学生的年龄,一个浮点数score用于存储学生的成绩。int age;这里声明了两个类型的变量student1和student2。int age;这种方式在定义结构体的同时声明了两个。
2025-03-11 11:18:26
1040
原创 深入理解 C 语言中浮点型数据在内存中的存储
在 C 语言的世界里,数据类型丰富多样,而浮点型数据用于表示实数,在科学计算、图形处理等众多领域都有着不可或缺的地位。然而,浮点型数据在内存中的存储方式相较于整型数据更为复杂,今天就让我们一同深入探索这一奥秘。
2025-01-10 20:14:26
1371
1
原创 C 语言内存秘籍:memcpy 等四函数的实用指南与底层解析
`memcpy`函数用于从源内存区域复制一定数量的字节到目标内存区域。这是一个字节级别的复制操作,它不关心数据的类型,只是简单地按照字节进行复制。
2025-01-09 20:13:51
1146
原创 探秘 C 语言字符串处理魔法:strstr、strtok、strerror 函数及 strstr 实现奥秘
首先定义了`my_strstr`函数,它接收两个参数`haystack`(主字符串)和`needle`(要查找的子字符串),- 并且参数都声明为`const char*`,这意味着在函数内部不能通过这两个指针去修改它们所指向的字符串内容。- 接着做了一个特殊情况判断,如果`needle`指向的字符串为空(即`*needle == '\0'`),- 那就直接返回`haystack`,因为按照`strstr`函数的逻辑,空字符串在任何字符串中都认为是存在的,- 且从开头位置就算找到。
2025-01-09 13:24:40
1408
原创 C 语言字符串操作秘籍:六大函数差异与应用实例
**strcpy/strcat/strcmp函数**- **strcpy**:用于将一个字符串复制到另一个字符串中,会覆盖目标字符串的原有内容。- **strcat**:用于将一个字符串连接到另一个字符串的末尾。- **strcmp**:用于比较两个字符串的大小关系,是按照字符的ASCII码值逐个比较的。- **strncpy/strncat/strncmp函数**- **strncpy**:将源字符串的指定数量的字符复制到目标字符串中。
2025-01-08 11:45:00
358
原创 C 语言字符逐鹿:strcmp 函数的深度较量之旅
在循环内,每次取出两个指针当前所指向的字符,比较它们的ASCII码值。如果不相等,就根据这两个字符ASCII码值的大小关系返回相应的值(小于返回负数,大于返回正数)。这里的“大小”并不是指字符串长度的长短,而是按照字符的ASCII码值顺序来进行比较的。头文件中,它会依次比较两个字符串中对应位置上的字符,直到出现不同的字符或者遇到字符串结束标志。的开头位置,然后通过循环,同时移动这两个指针,逐一对相应位置的字符进行比较。)时,也需要根据此时的情况来判断两个字符串的大小关系并返回对应的值。函数及其实现原理哦。
2025-01-08 11:30:00
1175
原创 C 语言 “粘合剂”:strcat 函数深度剖析与模拟实现
函数用于将一个字符串连接到另一个字符串的末尾,也就是把源字符串追加到目标字符串之后,形成一个新的字符串(目标字符串会被修改,其长度增加,包含了连接后的完整内容)。,表示复制完成,同时要记得在新的末尾位置添加。结尾的,所以我们可以通过循环遍历。,此时的位置就是可以开始追加的位置。希望通过这样的讲解,能让更好地理解。字符串,把每个字符依次赋值到。,以保证连接后的字符串依然是以。下面一步一步来模拟实现。相应的位置,直到遇到。
2025-01-07 20:18:02
469
原创 C 语言 strcpy 函数的进阶之旅
`my_strcpy`函数的主要功能是将一个字符串(包括结尾的`'\0'`字符)从源地址复制到目标地址。它用于在C语言中实现字符串的拷贝操作,是字符串处理中非常基础且常用的函数之一。
2025-01-07 18:41:18
853
原创 C 语言指针 “实战终章”:综合案例拆解,融会贯通指针编程之道(六)
通过以上案例,我们深入探讨了指针在数组和指针编程中的各种应用。无论是数组元素交换、数组指针传递,还是二维数组指针和指针数组的操作,指针都发挥着关键作用。在实际编程中,理解指针的概念和应用,能够帮助我们编写更高效、灵活的代码。希望读者通过这些案例,能够融会贯通指针编程之道,在今后的编程实践中取得更好的成果。
2025-01-04 13:46:36
580
原创 C 语言回调函数:原理、用途与代码详解之旅(五)
回调函数是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方(通常是事件的触发者)调用。- 首先,需要定义一个函数指针类型,它代表了回调函数的签名(返回值类型和参数类型)。- 例如,下面定义了一个函数指针类型`CallbackFuncType`,它指向的函数接受两个`int`类型的参数并返回一个`int`类型的值。```c```
2025-01-03 12:46:11
1502
原创 C 语言指针与数组传参深度探秘:从基础到函数指针的奇妙旅程(四)
和这里使用字符数组的形式来定义字符串。当使用这种方式时,编译器会为每个字符数组分配一块独立的内存空间,用于存储字符串中的字符(包括字符串结束符\0所以str1和str2虽然初始值相同,都是,但它们在内存中是存放在不同的位置上的两个独立的数组。和这种定义方式是创建了两个指向const类型(意味着不能通过指针修改其所指向的字符内容)的字符指针,并且让它们指向了字符串常量。在 C 语言中,字符串常量通常会被存储在只读的数据段中,并且相同内容的字符串常量在程序中往往只会存储一份。也就是说,str3和str4。
2024-12-18 14:13:41
1004
原创 四、位带操作:内存映射的神奇魔法
位带操作是一种可以单独对一个字节(8位)中的某一位进行读写操作的机制。在GD32F450ZG单片机中,位带操作提供了一种高效的方式来访问和控制寄存器或内存中的单个位,而不需要读取整个字节,修改位,然后再写回整个字节。这对于控制单个引脚(如GPIO引脚)的状态(置位或清零)非常有用。
2024-12-09 15:09:45
1352
原创 三、精准计时:滴答定时器探秘与应用
函数中,通过一个无限循环来等待定时器中断的发生并执行相应的操作。注意,实际应用中可能需要根据具体的开发环境和芯片库版本进行适当的调整。上述代码初始化了PD7引脚为输出模式,在。
2024-12-09 09:24:43
1367
原创 深入剖析 GD32F45ZG 引脚模式:功能与配置全攻略
功能:单片机引脚模式配置决定了引脚的工作方式,如作为输入读取外部信号、作为输出驱动外部设备、复用功能用于特定的通信协议(如SPI、I2C、USART等)或者模拟功能(如模拟输入/输出)。重要性:正确的引脚模式配置是确保单片机与外部设备正确通信和协同工作的基础。不同的应用场景需要不同的引脚模式,例如在读取按键状态时,需要将引脚配置为输入模式;在控制LED亮灭时,需要将引脚配置为输出模式。
2024-12-07 15:24:09
1307
原创 二、点亮希望之光:寄存器与库函数驱动 LED 灯
通过#define宏定义了一系列寄存器的地址,使用volatile关键字修饰是为了告诉编译器该变量(实际代表的寄存器内容)可能会被硬件等外部因素改变,编译器不要对其访问做优化,要每次都从实际的内存地址(寄存器所在地址)读取其值。例如就定义了这个寄存器对应的内存地址是0x40023830,后续可以通过对这个定义好的变量进行读写操作来操作对应寄存器。库函数是芯片厂商或者第三方为了方便开发者使用芯片的功能而编写的一组函数。这些函数封装了对芯片内部寄存器的操作,为开发者提供了一个更高级的编程接口。
2024-12-07 15:19:54
884
原创 一、开启 GD32 单片机的学习之门
GD32单片机基于先进的ARM Cortex-M内核架构构建,这一架构赋予了它强大的运算能力和高效的指令执行效率。其内核采用哈佛结构,数据总线和指令总线相互独立,使得数据读取和指令执行能够同时进行,大大提高了运行速度。在特点方面,GD32具有丰富的外设资源。例如,它配备了多个通用定时器,可用于精确的定时任务、PWM信号生成等;拥有多种通信接口,如USART、SPI、I2C等,方便与各类传感器、通信模块进行连接。
2024-12-06 11:30:00
1394
原创 探索单片机中存储器与寄存器的奥秘关联
在单片机的微观世界里,存储器和寄存器犹如两颗璀璨的星辰,它们虽各有独特的功能,却又紧密相连,共同构建起单片机高效运行的基石。
2024-12-06 11:30:00
1791
原创 C 语言指针 “多维迷宫”:二维数组、指针数组与指向指针的指针大揭秘(三)
通过以上从存储本质、元素访问和函数参数等多个角度对二维数组和指针关系的剖析,可以更深入地理解C语言中二维数组的工作原理,并且能够更加灵活地运用指针来操作二维数组。
2024-12-05 12:00:00
1176
原创 C 语言指针 “进阶探险”:数组与指针共舞,代码 “瘦身” 秘籍(二)
这样通过传递数组首地址的方式,函数可以有效地处理数组中的元素,而不需要进行大量的数据复制。这种传参机制是C语言中处理数组的一种高效且常用的方法。-我们在每一轮开始的时候添加上一个条件 判断,看是否有进行变换的元素,如果没有,就直接跳出循环。)的值相同,但它们的类型不同,在指针运算等操作中会有不同的表现。,即整个数组的地址。元素的数组的指针,它被初始化为。的指针,它被初始化为数组。
2024-12-05 11:45:00
1449
原创 指针数组 vs 数组指针:C 语言编程中不可忽视的区别
指针数组定义:指针数组是一个数组,其元素是指针类型。语法形式为类型 *数组名[数组大小]。例如,这里pArray是一个指针数组,它包含5个元素,每个元素都是一个指向int类型的指针。数组指针定义:数组指针是一个指针,它指向一个数组。语法形式为类型 (*指针名)[数组大小]。例如,这里pArrayPtr是一个数组指针,它指向一个包含5个int元素的数组。
2024-12-04 11:30:00
698
原创 函数栈帧的创建和销毁
函数栈帧的创建和销毁是C语言程序运行时的重要机制,它保证了函数的正确调用、参数传递和返回等操作,理解这一过程对于深入理解C语言的函数调用机制以及调试程序中的一些错误(如栈溢出等)非常有帮助。这个示例只是一个简单的示意,实际的函数栈帧创建和销毁过程在编译器和底层硬件的处理下要复杂得多,但通过这个示例可以对其基本原理和涉及的关键操作有一个初步的理解。所占用的存储空间清理(在这个简单示例中,主要是释放其占用的栈空间),然后将返回值传递给。函数中,当函数被调用时,会在其栈帧内为局部变量。函数内部,对应的形参。
2024-12-04 11:00:00
898
原创 C 语言 “神秘魔杖”—— 指针初相识,解锁编程魔法大门(一)
在计算机中,内存就像是一个个小格子(字节),每个格子都有一个唯一的编号,这个编号就是地址。变量存储在内存中,指针存储的就是这些变量的内存地址。也就是说,指针就是这个内存单元的地址。需要注意的是,指针运算应该在合理的范围内进行,特别是对于非数组元素的指针进行算术运算可能会导致未定义行为。是C语言中操作指针的重要工具,它们经常一起配合使用,使得程序员能够灵活地处理内存中的数据。变量,它在内存中有一个地址。(这是假设的十六进制地址),那么。总的来说,取地址操作符。
2024-12-03 11:30:00
1115
原创 炫酷来袭!用立创 EDA 专业版打造基于 51 单片机的梦幻心形流水灯
以下是基于51单片机实现你所需功能的C语言代码示例,代码中对相应端口进行操作以控制LED灯的亮灭状态切换来达到指定效果,这里只是实现了简单的亮灭操作。在这里,我将电源线宽度设置为25mil,信号线宽度设置为10mil进行的绘制,GND使用的铺铜。在最下方的器件类型中输入“Supplier Part”一栏中的编号,即可搜索到对应的元器件。点击“板框”按键,选择“矩形”进行绘制,尽量选择放在中心,方面计算。使用辅助线,将圆弧的范围锁定在10*10的边框内,进行心形的绘制。选择合适的元器件,将其导入到原理图中。
2024-12-03 11:00:00
2653
原创 条件编译:开启高效编程的钥匙,远离低效陷阱
在刚接触嵌入式C语言时,总是不理解为什么在创建头文件的时候要添加条件编译,总感觉自己写过的编译条件自己会不记得吗,添加条件编译是不是多此一举。尽管那些大神不断的解释,但基本上都是在本身就会的角度在解释,对小白的我就好像对牛弹琴,还隔着道门的感觉。直到有一次,忘记从那本书上看到的解释,加上自己实操以后,一下子开窍了一样。在这里就根据自己的理解,将其记录下来,希望能帮助到和我曾经一样迷茫的小伙伴。
2024-12-02 12:00:00
1061
原创 C 语言中递归与迭代的深度剖析
在实际的编程过程中,必须依据具体问题的特性以及需求来审慎决定到底是运用递归还是迭代。有些问题天生就与递归解法相得益彰,而在某些情形下,迭代则显得更为适宜。总之,深入理解并熟练掌握递归与迭代这两种编程方式,对于深度钻研 C 语言以及其他编程语言均有着举足轻重的意义。期望这篇文章能够助力你更为透彻地理解 C 语言中函数的递归与迭代!
2024-12-02 11:00:00
1489
原创 C语言中那些眼花缭乱的操作符-3
通过前两次对操作符的介绍,对于平时经常使用的操作符有了一定的了解,下面来介绍一下另外一些经常使用的操作符,尤其在嵌入式C语言中,更是如日常工具般经常使用。C语言中那些眼花缭乱的操作符-1C语言中那些眼花缭乱的操作符-2在C语言的编程世界里,操作符无疑是最为灵动且关键的元素之一。它们如同魔法师手中的各式法杖,各施其能,赋予代码丰富多样的表现力和强大的运算能力。从简单的算术操作符让我们能够轻松完成数值的四则运算,到关系操作符精准判别数据间的大小与相等关系,进而引导程序的走向;
2024-12-01 11:15:25
1186
原创 深入了解 C 语言 Bug
1、Bug 通常指的是程序中存在的错误或缺陷,它可能导致程序产生不正确的结果、崩溃或出现异常行为。Bug 可以是语法错误、逻辑错误、运行时错误等多种形式。
2024-06-03 14:03:26
822
原创 解锁C语言扫雷:详细攻略与完整代码解析
因为我们给用户展示的是9 * 9的扫雷界面,所以这里打印只需要打印9 * 9的中间界面即可。1.初始化范围是11* 11的数组,不是9* 9,布雷的时候才是9*9。9的棋盘上进行雷的布置和排查,所以就先创建出一个9。雷的位置是随机生成的,随机数的生成请参阅。棋盘准备好了,我们可以开始布置雷了。11,但雷还是布置在中间的9。一文,有详细的讲解。
2024-06-03 12:50:45
2009
原创 透视 static 和 extern 对函数的重大影响
实际编程中,我们需要根据具体的需求和场景,合理地运用 **static** 和 **extern** 。要充分考虑到变量的生命周期、作用域和可维护性等因素。正确地使用它们,可以让我们的代码更加简洁、高效和可靠;而错误地使用则可能引发一系列难以调试的问题。
2024-06-02 11:46:07
1100
原创 探索C语言{函数}的奥秘与精彩
自定义函数是程序员自行创造,能带给代码更多的可能性,形式如下:ret_type fun_name(形式参数)• ret_type 是函数返回类型• fun_name 是函数名• 括号中放的是形式参数• {}括起来的是函数体函数就像是一个加⼯⼚,参数就是输入的原材料,经过函数内的计算,得出结果。•ret_type是⽤来表⽰函数计算结果的类型。•fun_name是为了⽅便使⽤函数;就像工厂的名字⼀样,有了名字⽅便称呼,函数有了名字⽅便调⽤。•函数。
2024-06-02 09:31:17
1001
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人