C语言基本笔记(1)——变量和常量
太基础的语法知识可以参阅菜鸟教程网站:
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}; // 预计算正弦值
浙公网安备 33010602011771号