1. 内存与地址的基础概念
1.1 内存单元的物理结构
计算机内存就像一栋巨大的宿舍楼,每个房间(内存单元)都有固定的大小。在大多数现代计算机体系中,最小的可寻址内存单元是1个字节(Byte),相当于一个8人间宿舍。每个字节由8个比特位(bit)组成,就像宿舍里的8个床位。
内存编址的实质是为每个字节分配唯一的标识符。假设我们有一个16GB的内存:
- 总字节数 = 16 × 1024³ = 17,179,869,184字节
- 需要约34位二进制数才能表示所有地址(2³⁴=17,179,869,184)
注意:虽然x86架构支持按字节寻址,但某些处理器(如DSP)可能只支持按字(word)寻址,这是硬件设计差异导致的。
1.2 地址总线的硬件实现
32位系统的地址总线实际工作方式:
- CPU发出内存请求时,会在地址总线上放置32位地址信号
- 内存控制器解码这些信号,定位到具体的内存芯片和存储单元
- 数据通过数据总线传输,其宽度通常与CPU字长相同(32位系统一般为32或64根数据线)
地址空间计算示例:
- 32位系统:2³² = 4,294,967,296个地址 → 4GB寻址空间
- 64位系统:理论上2⁶⁴地址空间,实际实现通常只使用48-52位
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针的本质与操作
2.1 变量地址的底层原理
当声明int a = 10;时:
- 编译器在栈上分配4个连续字节(假设sizeof(int)=4)
- 变量名
a在编译后会转换为地址引用 - 地址值取决于运行时栈内存布局
内存布局示例:
code复制地址 值
0x006FFD70 0x0A (10的十六进制低字节)
0x006FFD71 0x00
0x006FFD72 0x00
0x006FFD73 0x00 (小端序存储)
2.2 取地址操作符的深入解析
&操作符在汇编层面的表现:
assembly复制; C代码: &a
lea eax, [ebp-4] ; 计算变量在栈帧中的地址
关键特性:
- 获取的是变量的首字节地址
- 类型信息保留:
&a的类型是int* - 对寄存器变量使用&会导致编译错误(无内存地址)
