1. 指针的本质与计算机内存模型
1.1 内存寻址的基本原理
计算机内存本质上是一个巨大的字节数组,每个字节都有唯一的地址标识。当我们声明一个变量时,系统会在内存中分配一块连续的空间来存储该变量的值。例如在32位系统中,int类型通常占用4个字节的内存空间。
寄存器作为CPU内部的超高速存储单元,其数量非常有限(x86架构通用寄存器约8个)。这就决定了绝大多数数据必须存放在内存中,寄存器仅用于临时存放当前正在处理的数据。指针变量存储的就是这些内存单元的地址值,本质上它是一个整数,但这个整数的特殊之处在于它代表的是内存位置的"门牌号"。
关键理解:指针的值是内存地址,指针的类型决定了如何解释该地址开始的内存内容
1.2 直接访问与间接访问的差异
直接访问变量时(如int a = 5;),我们操作的是变量名绑定的内存块。而通过指针访问时(如int *p = &a; *p = 10;),需要先读取指针变量存储的地址值,再通过该地址找到目标内存块,这种二次寻址就是"间接访问"。
这种间接性带来了重要的灵活性:
- 可以在运行时动态决定访问哪个内存位置
- 允许不同代码段共享同一块内存区域
- 实现复杂的数据结构和内存管理
c复制// 典型指针使用示例
void modifyValue(int *ptr) {
*ptr += 100; // 通过指针间接修改外部变量
}
int main() {
int value = 42;
modifyValue(&value);
// 此时value的值变为142
}
1.3 指针与寄存器限制的关系
现代CPU的寄存器确实可以存储地址值,但这不改变指针的本质特性。寄存器主要影响的是指针访问的效率:
- 指针变量本身可能被存储在寄存器中加速访问
- 但指针指向的目标数据通常仍在内存中
- 编译器会优化频繁使用的指针解引用操作
在函数调用时,寄存器数量限制直接影响了参数传递机制。System V AMD64 ABI规范约定了哪些寄存器用于参数传递(rdi, rsi, rdx, rcx等),当参数超过寄存器容量时,剩余参数就必须通过栈来传递。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 函数传参的底层机制
2.1 值传递的本质与开销
C语言默认
