C语言关键技术 - 数据结构与关键字:静态循环队列、结构体、枚举、关键字volatile、register、static、const

静态循环队列

问题:如何区分队列空和对列满?
知识点:
1.入队先检查非对满,出队先检查非对空
2. rear所指的单元始终为空
3.rear所指的为队尾的下一个元素

4.入队是rear追赶front
5.函数func1结束后,指针p被释放掉(malloc分配的空间并没有被释放)
链接: link

结构体内存对齐

在这里插入图片描述

枚举

自定义数据类型来描述一类具有相同特征点的事务,主要支持的有结构体,枚举和联合体。其中枚举通过别名限制数据的访问,可以让数据更直观,易读,实现如下:
typedef enum {spring=1, summer, autumn, winter }season;
season s1 = summer;

volatile

保证对该变量的修改都是直接对内存存放的值操作。
易变的,可变的,一般用于以下几种状况:
1)并行设备的硬件寄存器(如:状态寄存器)
2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3)多线程应用中被几个任务共享的变量
volatile可以解决用户模式和异常中断访问同一个变量时,出现的不同步问题,另外在访问硬件地址时,volatile也阻止对地址访问的优化,从而确保访问的实际的地址,精通volatile的运用,在嵌入式底层中十分重要,也是嵌入式C从业者的基本要求之一。

register修饰变量

定义为register的局部变量会被优化到直接放在通用寄存器中,在优化运行速度时用。
1.局部的(全局会导致CPU寄存器被长时间占用)
2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
3. 高频被读取的(提高效率所在)
4. 如果要使用,请不要大量使用,因为寄存器数量有限
现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。
链接: link

static

	static在文件作用域和代码块作用域的意义是不同的:在文件作用域用于限定函数和变量的外部链接性(能否被其它文件访问), 在代码块作用域则用于将变量分配到静态存储区。

修饰全局变量,防止其他文件引用
修饰局部变量,作用于 函数内,函数调用结束后保留当前值
修饰函数,只在定义它的文件中使用

const

const定义全局变量定义在FLASH中。存储受限时用。
定义常量,不可变性。
如同宏定义,修饰特殊意义的数字
防止修改意外,增强健壮性
节省空间,减少内存

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值