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}; // 预计算正弦值
    
posted @ 2025-04-11 18:37  故渊Y  阅读(199)  评论(0)    收藏  举报