
C语言
文章平均质量分 87
C语言相关
小吴的嵌入式笔记
嵌入式从业10年,记录和分享工作学习心得
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
指針(2)
是uint8_t类型的。通过pbuf[]占位,malloc申请的内存空间大一点,由于pbuf[]所在的地址就在p的后面,所以p->buf和p+1指向的位置是一样的。再如果指针p的类型是int,即int *p,如果p等于buf[0]的地址,那p+1以后的值就是往后int长度(4个),p+1的值就是&buf[4],*(p+1)访问的就是buf[4]。而相对的,p是一个指针,他的。2.指针p本身是个变量,只不过这个变量的值是他所指向的内存的地址,通过*p就可以读写那块内存,读写的数据长度就是指针类型的大小。原创 2025-01-24 12:34:29 · 629 阅读 · 0 评论 -
探索字节队列的魔法:多类型支持、函数重载与线程安全
自动推断数据类型和大小,支持不同类型数据的队列操作。通过宏模拟 C 语言的函数重载,灵活处理不同数量和类型的参数。通过禁用中断机制确保队列操作在多线程环境中的原子性,避免数据竞争问题。这些改进使得我们的字节队列不仅可以在单线程环境中高效运行,还能在复杂的多线程系统中保持数据的一致性与安全性。宏不是奇技淫巧宏可以封装出其它高级语言所提供的“基础设施”设计良好的宏可以提升代码的可读性,而不是破坏它设计良好的宏并不会影响调试宏可以用来固化某些模板,避免每次都重新编写复杂的语法结构。原创 2025-01-24 12:28:12 · 889 阅读 · 0 评论 -
变参函数和可变参数宏
在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list 、 va_start 、 va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。i < count;i++)可变参数宏的定义和使用。原创 2025-01-24 12:10:21 · 951 阅读 · 0 评论 -
关于宏-转载
【说在前面的话】市面上大部分C程序员对宏存在巨大的误解甚至是恐惧,并因此极力避免宏的适度使用,甚至将宏在封装中发挥正确作用的行为视作是对C语言的“背叛”——震惊之余,对于为什么大家会有这种想法的原因,我曾经一度是非常“傲慢的”,这种傲慢与某些人宣称“穷人都是因为懒所以才穷”时所表现出的那种态度并无任何本质不同——然而我错了,在闲暇之余认真看了不少经典的C语言教材后我才意识到:不是读者普遍懒或者轻视教材中有关宏的内容,而是那些对宏来说如同“加法交换律、结合律”一样的基本规则和知识并没有认真且完整的出现在教科书原创 2025-01-24 11:39:26 · 995 阅读 · 0 评论 -
printf底层实现及扩展
如上图所示,当我们系统里面有多个串口都需要格式化输出的时候该怎么办呢?毕竟底层的fputc()只有一个。当我们知道了printf的实现,我们就可以通过编写不同的fputc的代码来实现不同的功能,比如。printf使用的时候会调用一个底层函数fputc(),下方演示了STM32中的实现。通过上述方式就实现了printf()打印显示液晶屏的功能了。二.灵活修改fputc()扩展printf()的应用范围。三.如何实现多串口格式化输出。原创 2025-01-24 10:36:36 · 419 阅读 · 0 评论 -
C语言一些简单的细节记录
比如我们在程序A中定义并申明了一个变量int Val而B、C、D几个.c程序都会要用到A中的int Val,此时我们直接在B、C、D的.c文件中用extern int Val确实也可以访问到这个变量,但是如果我们对A里面这个变量定义修改了呢?先执行表达式1,如果表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果;如果表达式1的结果如果为假,执行表达式3,运算式的结果是表达式3的结果。如果a>b那么结果就是a的值,如果a<b,那么结果就是b的值。原创 2024-09-14 13:47:23 · 495 阅读 · 0 评论 -
RAM及FLASH分区(STM32为例)
它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。RW_data:Read Write data,可读写数据域,指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。RO_data:Read Only data,只读数据域,指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。原创 2024-09-14 11:46:06 · 1043 阅读 · 0 评论 -
extern、static、const关键字
在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义。但是这样定义的变量通常被称为局部静态变量,它的值的不会因为函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上衣次调用结束后的值。说到作用域,我们需要说明,尽管使用extern关键字修饰的变量,其原本都是全局变量,但如果extern int var声明处于某一函数体内,那么其作用域就在函数体内。关键字修饰的变量,在声明时必须进行初始化。原创 2024-09-13 14:58:41 · 955 阅读 · 0 评论 -
typedef与define
当然,我们也可已使用定义的类型声明指针变量,或者直接使用typedef关键字定义指向对象的指针类型,如定义结构体指针类型。同样的,如果我们对二维数组采用类似的定义。这样我们在需要使用结构体类型定义一个对象时,我们可以使用CLASSICPID vPID就可以了与使用原始定义是一样的。这样我们就定义了一个指针类型,当我们使用pointer p声明一个指针变量,就和使用int *p的含义是一样的。那它的含义与指针是类似的,如我们定义array a就是声明了一个M行N列的数组,此时使用p=a是可以的。原创 2024-09-13 13:03:06 · 675 阅读 · 0 评论 -
独立执行体、闭包表达式、串化符#及连接符##
在这个程序中,预处理器首先遇到TO_STRING(VALUE)会替换为#VALUE,然后再替换为"100",所以最终输出的内容是字符串100,回车之后再输出一个换行符。一般我们认为函数声明(上述的void Func(void))和{}是一个整体,一个构成了一个函数,但其实并不完全是这样,C语言中{}是独立的,叫做独立执行体或者。先引入一个例子,比如我们想用一个宏,然后用printf函数打印宏的内容,我们会怎么做呢?当宏参数是另一个宏的时候,凡是宏定义中有#、##的地方,宏参数不会再展开,比如。原创 2024-09-12 14:11:03 · 469 阅读 · 0 评论 -
联合体与枚举
直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。1、枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。//进行完这句后就一切ok了,下面通过访问test中数组a的数据来取出高低字节的数据。// test.a[0]中存储的是高位数据。原创 2024-09-10 08:37:26 · 690 阅读 · 0 评论 -
C语言指针篇
指针的本质就是有类型的地址。地址指的是地址总线上的地址码表,而类型决定了我们操作这个指针时,要从这个地址码上读写的长度。即指针的类型决定读写一个地址块的数据长度(1字节、2字节、4字节还是结构体定义的长度)。比如(uint8_t *)(0x12345678):C语言中*可以把他后面的内容变成地址码,所以(*)0x12345678)就是把这个常数转化为一个地址码(即指针),那这个指针的类型是什么呢?是uint8_t类型的。原创 2024-09-09 08:37:28 · 3290 阅读 · 0 评论 -
结构体系列
struct {// a占用3位// b占用5位// c占用8位(即一个字节)// d占用16位(即两个字节)如果是有几位不用怎么办呢?那几位不带位域名称就好了struct {// a占用3位// 把位域名称去掉就可以了// c占用8位(即一个字节)// d占用16位(即两个字节)需要注意的是,位域定义必须是LSB,即前面的为低位。另外对位域成员赋值不能超过他最大能表示的范围。原创 2024-09-08 10:07:40 · 2114 阅读 · 0 评论 -
C语言学习——sprintf函数详细解释及其用法
文章目录。原创 2024-09-05 09:15:48 · 12779 阅读 · 0 评论 -
C语言面向对象
抽离出各个对象中共有的方法draw,将其单独放置在一个对象Shape内。各个对象均继承于Shape对象。将各个子对象中的draw方法,设置为各自的实现方法。声明一个Shape对象的指针,并将其赋值为一个子对象的指针。通过上述对象指针,调用方法共有方法draw,执行的是第三步中设置的方法。原创 2024-09-05 08:57:51 · 1045 阅读 · 0 评论 -
C语言 - 常用的字符串处理函数整理_字符串匹配函数
目录。原创 2024-09-05 08:42:48 · 1388 阅读 · 0 评论