太基础的语法知识可以参阅菜鸟教程网站:
https://www.runoob.com/cprogramming/c-program-structure.html
这里补充一些日常常用的、面试时候可能会问到、考察到的知识
变量和常量
变量
变量是程序中用于存储数据值的标识符,其在程序执行过程中的值是可以改变的。每个变量都有一个数据类型,它定义了变量存储的数据种类(如整数、浮点数、字符等)以及占用的空间大小。
特点:
可变性: 变量的值在程序运行时可以被改变。
地址固定性: 变量被分配内存空间后,其存储单元地址在程序运行期间是固定不变的。一个变量实质上代表了内存中的某个存储单元,这个存储单元的地址在变量的生命周期内保持恒定。
类型性: 变量声明时必须指定数据类型。
标识性: 变量通过唯一的标识符(变量名)进行访问。变量名由用户定义,必须符合标识符的命名规则。
变量的分类
1. 按存储位置划分
类型
存储区域
生命周期
初始化
单片机场景
全局变量
RAM(.data或.bss)
程序全程
默认0(若未显式初始化)
跨函数共享数据(慎用,易耦合)
静态变量
RAM(.data或.bss)
程序全程(静态全局)或函数调用间(静态局部)
默认0
模块内部状态保持
局部变量
栈(Stack)
函数执行期间
随机值(需显式初始化)
临时计算、参数传递
寄存器变量
CPU寄存器
函数执行期间
无保证
高频访问的临时变量(register关键字提示)
关键区别:
全局/静态变量由编译器分配固定地址,局部变量在栈上动态分配。
未初始化的全局/静态变量默认清零(位于.bss段),显式初始化的在.data段。
2. 按修饰符划分
修饰符
作用
单片机应用场景
volatile
禁止编译器优化,强制从内存读写
硬件寄存器、多线程/中断共享变量
static
限定作用域或延长生命周期
模块内私有变量、保持函数调用状态
const
定义只读变量(可能存储于Flash)
配置参数、查表数据
extern
声明外部定义的变量
多文件共享全局变量
常量
常量是一种在程序定义后其值不能被修改的标识符。在C语言中,常量可以是直接量(如字面常量5、'a'),也可以是通过#define预处理指令或使用const关键字定义的命名常量。
特点:
不变性: 一旦定义,常量的值不可更改。
类型性: 常量具有确定的数据类型。
标识性: 命名常量通过唯一的标识符进行访问。
常量的分类
1. 常量分类
类型
存储位置
修改权限
单片机适用场景
#define宏
预处理期替换
不可修改
固定阈值、寄存器地址定义
const常量
Flash(通常)
只读
大型只读数据(如字体库)
枚举常量
编译期符号
不可修改
状态机定义、可读性强的选项
constexpr(C++)
编译期计算
不可修改
C++嵌入式开发中的编译期优化
对比:
#define无类型检查但节省内存,const有类型安全但可能占用Flash。
优先用const替代#define(除非需要兼容C89或节省Flash)。
2. 常量优化技巧
合并相似常量:
const float PI = 3.14159f;
const float PI_DOUBLE = PI * 2; // 编译期计算(C++中需constexpr)
位域压缩:
struct { uint8_t mode : 3; // 3位模式
uint8_t en : 1; // 1位使能} config;
查表法替代计算(空间换时间):
const uint8_t SIN_TABLE[64] = {0, 3, 6, ..., 255}; // 预计算正弦值