1. 左值与右值:内存中的两种存在形式
在C++开发中,理解左值和右值的区别是掌握内存操作的基础。左值和右值本质上是描述内存中值的存在形式,这对后续理解引用、指针等概念至关重要。
1.1 左值:有固定地址的持久变量
左值(lvalue)可以简单理解为"有固定地址的变量"。它们有以下核心特征:
- 具有明确的标识符(变量名)
- 占据固定的内存位置
- 生命周期通常跨越多个表达式
- 可以被多次读取和修改
在嵌入式开发中,典型的左值包括:
- 全局变量(存储在静态存储区)
- 局部变量(存储在栈上)
- 寄存器映射变量(硬件寄存器对应的内存地址)
cpp复制// 典型的左值示例
int global_var = 10; // 全局变量,典型的左值
void func() {
int local_var = 20; // 局部变量,也是左值
volatile uint32_t *reg = (uint32_t*)0x40021000; // 寄存器指针,左值
global_var = 30; // 可以修改
local_var = global_var + 5; // 可以读取和赋值
}
左值的一个重要特性是可以获取其内存地址(使用&运算符),这在嵌入式开发中尤为重要,因为经常需要直接操作硬件寄存器地址。
1.2 右值:临时的数据载体
右值(rvalue)则是临时性的值,它们:
- 通常是表达式计算的中间结果
- 没有固定的内存地址
- 生命周期通常仅限于当前表达式
- 不能被多次修改
嵌入式系统中常见的右值包括:
- 字面常量(如42,3.14f)
- 函数返回值(非引用返回)
- 算术表达式的结果
- 类型转换的结果
cpp复制int get_value() {
return 42; // 返回值是右值
}
void demo() {
int a = 10; // 左值
int b = a + 5; // a+5是右值
int c = get_value(); // 函数返回值是右值
// 以下操作都是非法的,因为试图操作右值
// &42; // 错误:不能取字面量的地址
//
