静态循环队列
问题:如何区分队列空和对列满?
知识点:
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中。存储受限时用。
定义常量,不可变性。
如同宏定义,修饰特殊意义的数字
防止修改意外,增强健壮性
节省空间,减少内存