嵌入式C语言基础
本专栏专注嵌入式C语言应用方向,C语言基础不好看这一专栏就够了
Jarrett_Zheng
这个作者很懒,什么都没留下…
展开
-
C语言中二维数组的地址空间分配
一维数组我们都知道是一块连续的内存空间,那么二维数组的分配很明显也是一块连续的内存空间,不一样的地方在于二位数组是有行、列两个下标(实际名字叫什么我记不清了知道的同学可以评论区评论一下),其分配地址是就是多个数组依次次分配。如上面是示例,NF_Data.Para[0][n],就保存在buff[n],NF_Data.Para[1][n],就保存在buff[2n],可以理解为一行就是一个数组然后每行都是连续的。原创 2024-02-05 11:16:20 · 134 阅读 · 1 评论 -
不学会指针就不算学会C语言
指针在定义时会被分配空间用来保存地址,这个空间的大小只取决于硬件平台的位数,对于ARM32,指针变量用于保存地址空间是4个字节,它与定义时的数据类型无关。程序运行时,变量数据保存在RAM内存中,变量保存的数据被分配到内存地址空间由CPU和编译器自动分配内存空间。解释一下这句话,也就是说你想保存一个int8_t的地址类型的数据,指针类型要是int8_t *首先讲解以下指针变量的一个重要符号。使用指针做传参可以修改变量的数值。不说废话这章我直接发干货。2、通过指针访问寄存器。指针变量常见定义错误。原创 2023-05-10 23:29:15 · 55 阅读 · 0 评论 -
C语言通用链表
通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。原创 2023-04-16 20:57:58 · 300 阅读 · 0 评论 -
C语言通用链表
通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以。需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。原创 2023-04-16 19:38:04 · 194 阅读 · 0 评论 -
如何根据结构体中成员的地址获取整个结构体的首地址
LOS_DL_LIST_ENTRY通过结构体内某个成员变量的地址和该成员的名字,以及数据结构体类型,找到该结构体变量的首地址。根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。具体的实现其实就是我前面结构体与动态内存章节开始说的结构体数据对齐去寻找到首地址的。在鸿蒙Lite os中是通过LOS_DL_LIST_ENTRY宏函数实现的。原创 2023-04-16 18:59:49 · 1047 阅读 · 0 评论 -
C语言contiue、break、return、exit()函数有什么区别
break 强制退出循环或者switch,程序会执行循环后面的语句,每个分支下加一个break可以防止直接进入下一个分支执行,从一个分支进入下一个分支的做法并不健全;exit() 函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。return 仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体;contiue 用于循环语句,跳出本次循环,程序会开始下一次循环;原创 2023-04-15 19:30:19 · 216 阅读 · 0 评论 -
嵌入式c语言单向链表
注意:这种方法是判断prev指向的是不是尾节点,current保存的地址是不是尾节点的下一项NULL,current本身指向的就是尾节点的next,当current指向NULL时循环已经退出了,此时prev保存的就是为尾节点,prev的next指向的就是新的节点。注意:这种方法是判断current保存的下一个地址是不是NULL,current本身指向的是尾节点,在current后面就是新的节点。链表是结合结构体和指针的综合应用,学习之前务必复习结构体和指针的相关知识。找到尾节点后添加新节点到链表尾部。原创 2023-04-13 17:16:27 · 117 阅读 · 0 评论 -
双向循环链表
双向循环链表优点:通过1个指针变量,就可以找到前向节点和后向节点,方便写程序,可以从任意节点位置开始遍历整个链表。在学习单向链表时,创建的结构体只用了1个指针,指向下一个节点首地址;添加和删除节点用了两个指针,分别指向被操作节点的前节点与后节点。这样可以保证链表在只有1个头节点的情况下,也是一个双向循环链表。在实际使用中相比于单向链表,双向链表才是比较常用的数据结构。将尾节点next指向NULL改为指向头节点首地址;将头节点的prev指向尾节点的首地址。在双向链表的基础上设计双向循环链表。原创 2023-04-15 15:49:27 · 74 阅读 · 0 评论 -
strlen()函数
strlen()函数的原理就是判断字符串是不是结尾的\0不是就++,是就停止。strlen()函数用于返回字符串长度,但不包括字符串结尾\0。编译器在处理字符时,会自动在函数末尾添加ASCII码'\0'。原创 2023-04-09 22:12:37 · 66 阅读 · 0 评论 -
字符串的本质
/这样时改写不了的,因为5中说过不可以改写。//使用指针变量访问第0个元素,将m改写成M。字符串是一种特殊的数据类型,是一些ASCII码的集合,包含在" "里。ASCII码和字符串有区别,'A'是一个字符。原创 2023-04-09 22:03:46 · 219 阅读 · 1 评论 -
结构体指针与动态内存
结构体成员包含指针类型与动态内存。首先讲解以下结构体数据对齐。结构体指针变量与动态内存。原创 2023-04-03 21:23:56 · 373 阅读 · 1 评论 -
指针与动态内存申请
一文教你指针与动态内存申请,包括常见使用场景和野指针的定义。void *malloc(unsigned int size)//动态内存分配函,用于在堆上申请一块指定大下连续的内存区域,单位时字节,申请成功返回分配区的起始地址,分配失败返回NULL,返回结果为viod*需要自己强制转换为需要的类型。场景1:指针变量p使用完没有指向NULL,但是内存空间free了,当指针变量m指向新申请的内存后,p仍然可以改写m的数据,p就是野指针。原创 2023-04-02 21:52:20 · 583 阅读 · 0 评论