- 博客(25)
- 收藏
- 关注
原创 嵌入式(C语言篇)Day13
结构组成:由LinkedList结构体管理head(头指针)、tail(尾指针)、size(节点数),每个Node包含data(数据)和next(后继指针)。核心操作:涵盖创建、销毁、遍历、增删查等,操作时需注意头/尾节点特殊情况(如首个节点需同时更新head和tail面试题关键思路时间复杂度空间复杂度求中间结点快慢指针法(单次遍历)O(n)O(1)判断是否有环快慢指针法(相遇即有环)O(n)O(1)反转链表三指针迭代反转(prev、curr、succ)O(n)O(1)
2025-05-31 19:41:15
969
原创 手动实现单链表操作
本文介绍了如何手动实现单链表的操作,包括链表的创建、销毁、插入、搜索和删除等功能。通过定义链表结点结构和链表管理结构,实现了头插法、尾插法、按索引插入等操作。代码中详细展示了如何分配和释放内存,以及如何处理链表的各种边界情况。此外,还提供了按索引搜索和按数据值搜索的功能,并实现了按数据值和索引删除结点的操作。最后,通过打印函数可以直观地查看链表的内容。这些操作为单链表的基本功能提供了完整的实现,适用于需要动态管理数据的场景。
2025-05-20 08:40:14
313
原创 嵌入式(C语言篇)Day12
/ 学号// 总分int age;// 年龄// 姓名} Student;定义比较函数:根据需求编写compare函数,确保指针转换和返回逻辑正确。调用qsort:传入数组首地址、元素个数、单个元素大小及比较函数。验证结果:通过遍历数组或打印检查排序是否符合预期。核心口诀指针转换要正确,类型匹配是关键。比较函数返回值,符号决定前后序。元素大小需精准,避免越界和错误。
2025-05-19 19:37:25
803
原创 嵌入式(C语言篇)Day11
动态数组特性:具有初始容量,可在容量不足时自动扩容,存储元素数量(size)随数据增减变化,实际内存容量(capacity)按需扩展。内存模型// 指向堆内存的数组指针int size;// 当前已存储元素数量// 动态数组总容量} Vector;二级指针:指向一级指针的指针,用于间接操作原始数据或修改一级指针的指向。int a = 10;// 原始数据// 一级指针,指向a的地址// 二级指针,指向p的地址解引用操作*pp:获取一级指针p的值(即a的地址)。**pp:获取a的值(即10。
2025-05-19 19:34:14
920
原创 嵌入式(C语言篇)Day10
字符串数组本质:存储多个字符串的容器,可通过二维数组或指针数组实现。选择原则只读、固定长度场景 → 二维字符数组。动态操作场景 → 字符指针数组。命令行参数:通过argc和argv获取,首个参数为程序路径,需手动转换数据类型。指针操作核心:理解指针指向与内存区域的可写性(只读数据段 vs 栈/堆区)。typedef struct 结构体本名 {成员类型1 成员名1;成员类型2 成员名2;// ...} 结构体别名;示例int stu_id;// 学号// 姓名(字符数组)
2025-05-19 19:22:58
833
原创 (C语言篇)处理字符串的四个基础函数
函数功能返回值关键风险strlen(s)计算字符串s的长度size_t类型的长度值字符串未以'\0'结尾会导致越界复制src到dest的指针可能引发缓冲区溢出将src追加到dest末尾dest的指针可能引发缓冲区溢出比较s1和s2整数(<0、0、>0)
2025-05-19 19:11:07
681
原创 (C语言)内存分配函数
malloc此函数会分配一块指定大小(以字节为单位)的内存空间,并且不会对这块内存进行初始化。也就是说,分配后的内存中存储的是之前的随机数据。calloc该函数用于分配num个元素的内存空间,每个元素的大小为size字节,分配完成后会将所有字节初始化为0。realloc它的作用是调整之前分配的内存块大小,可以将其扩大或者缩小。如果传入的指针ptr为NULL,那么它的功能就和malloc一样。
2025-05-19 19:10:17
513
原创 数组指针和指针数组
项目指针数组(Array of Pointers)数组指针(Pointer to Array)定义一个数组,数组元素是指向某个数据类型的指针一个指针,指向一个数组声明方式使用场景存储多个不同的指针存储指向固定大小数组的指针内存布局存储多个指针,每个指针指向数组的不同元素存储一个指针,指向一个整个数组示例。
2025-05-15 09:53:32
228
原创 嵌入式(C语言篇)Day9
C语言提供了一系列字符串标准库函数用于处理字符串,使用这些函数需要包含头文件<string.h>。主要函数包括求字符串长度、字符串复制、字符串拼接和字符串比较等。我们不仅要理解这些函数的行为,还需掌握手动实现的方法。
2025-05-14 22:23:31
1476
原创 嵌入式(C语言篇)Day08
重点关注指针类型形参。指针类型形参看似需要传入指针,实际需要的是指针指向的内存块。通过有无 const 修饰判断函数对内存块的操作,无 const 修饰可能读写,有 const 修饰只会读。本质上是存储在只读数据段中以空字符结尾的字符数组,包含字符串内容和一个空字符,无多余内容。生命周期是静态存储期限,程序运行期间都有效。字符数组只能访问,不能修改,修改会引发未定义行为,通常导致程序崩溃。多数情况下,代码中可直接视为数据段中字符串字符数组首元素指针。例如,“hello” 可视为'h'元素指针,
2025-05-14 09:11:18
1284
原创 变量易混淆问题
为2,第二次调用后为4。静态局部变量只在首次调用函数时初始化,后续调用保留上次的值,每次。为2,第二次调用后为4。因为全局变量在整个程序运行期间都存在,可被各函数修改,每次。普通局部变量每次函数调用时重新分配内存并初始化,静态局部变量的作用域仅限于其定义所在的函数内部,,使其作用域被限制在当前源文件内,其他源文件无法通过。引用,防止不同源文件同名全局变量冲突。C语言中函数参数传递是值传递,每次都初始化为1,然后乘以2得到2。是形参,是局部变量,和全局变量。的作用域内,所以无法访问。值的副本,在函数内对。
2025-05-12 16:48:45
532
原创 嵌入式(C语言篇)Day6
递归是逻辑简洁性与执行复杂性的权衡,基于函数调用栈先进后出原理,利用人类分解问题的思路和计算机的快速计算能力,是解决特定问题的极佳手段。不建议将递归作为求解问题的第一手段,尤其是问题可通过循环迭代求解且不难理解时。树形结构问题的求解是最常使用递归的场景,如数据结构BST的遍历、文件系统的操作。使用递归求解问题时,无需过多考虑中间过程,分析清楚递归的分解思路(递归体)和终止条件(出口)即可。
2025-05-11 19:01:04
772
原创 嵌入式(C语言篇)Day5
函数定义位置影响调用:若函数调用在函数定义之前,需提前声明函数原型(告知编译器函数的返回类型和参数列表)。返回类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...);,参数名可省略。// 提前声明原型add(1, 2);// 调用在定义之前return 0;// 函数定义代码复用与模块化:当某段代码需要重复使用,或功能可独立封装时,应定义为新函数,遵循“单一职责原则”(一个函数仅实现一个独立功能)。
2025-05-10 20:53:44
1029
原创 嵌入式(C语言篇)Day4
运算优先级混淆整型除法导致精度丢失自增自减的副作用短路逻辑影响执行流程越界访问/修改表现:访问/修改下标超出数组长度(如arr[5]对长度为5的数组)。后果:访问越界读取未知内存数据(未定义行为);修改越界可能破坏栈空间或其他数据,导致程序崩溃(如MSVC报错未初始化局部数组:直接使用未初始化的局部数组(如读取arr[0]),其值为随机垃圾值(MSVC中常见0xCC标记),引发不可预测错误。数组优势:随机访问高效(O(1)),适合数据固定的场景。注意事项:下标从0开始,避免越界操作。
2025-05-10 20:41:38
827
原创 嵌入式(C语言篇)Day3
整型默认符号性shortintlonglong long默认有符号,char符号性依平台而定,建议显式声明。浮点数特性:范围大但精度有限,适用于非精确计算场景。无符号数原则:仅在明确非负数场景使用,避免与有符号数混用。关键字typedef,用于为已存在的类型定义别名,使同一类型拥有两个名称。语法格式typedef 现有类型名 别名;示例// 为int定义别名Integer// 等价于int a = 10;作用:计算类型或变量所占内存空间的字节数,结果为无符号整数size_t。
2025-05-10 20:19:45
704
原创 嵌入式(C语言篇)Day2
define在C99及以后的C语言版本中,建议在使用局部变量时再进行定义。而C90版本要求在函数开头定义所有局部变量,不太合理。实际开发大多使用C99及以上版本,所以遵循在使用时定义局部变量的方式。整型:包含charshortintlonglong long。这些整型又可分为有符号和无符号两种状态。有符号整型能表示正数、负数和0,无符号整型只能表示正数和0,它们在内存中存储方式和取值范围有所不同。浮点型:有floatdouble,用于表示带小数部分的数值,不同类型的浮点型在精度和取值范围上存在差异。
2025-05-08 19:38:59
664
原创 嵌入式(C语言篇)Day1
定义:在C/C++ 的官方标准中,并没有规定此类行为的后果,具体的行为后果由编译器、平台自由决定。示例:在C语言中,如果某个局部变量没有明确手动初始化,那么该局部变量的取值就是一个未定义行为。这种未定义行为在不同平台、编译器下的结果可能不一样,行为不可预测。例如,在MSVC下,使用未初始化的局部变量会引发编译错误;而在GCC中,可能倾向于给0值,而不是编译报错。可能的结果程序崩溃/报错编译失败出现莫名其妙的结果出现看起来很正确的结果结论。
2025-05-08 19:25:08
959
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人