1. 指针的本质:内存与地址的映射关系
指针是C语言中最核心也是最难掌握的概念之一。要真正理解指针,我们必须从计算机内存的基本工作原理讲起。
1.1 内存的物理结构
计算机内存可以想象为一栋巨大的酒店,这栋酒店有数十亿个房间(内存单元),每个房间都有唯一的门牌号(内存地址)。在32位系统中,这些地址通常用8位十六进制数表示,如0x004FFA20;64位系统中则使用16位十六进制数。
每个内存单元的大小是1字节(byte),这是内存管理的最小单位。当我们声明一个int变量时,这个变量会占用连续的4个字节(在大多数现代系统中),就像一个人住了4个连号的房间。
注意:内存地址是从0开始连续编号的,但操作系统会保留低地址区域用于特殊用途,所以用户程序通常从较高的地址开始分配。
1.2 变量与地址的关系
当我们声明一个变量:
c复制int a = 10;
计算机做了三件事:
- 在内存中分配4个连续字节(假设int为4字节)
- 将这4个字节的起始地址与变量名a关联
- 将值10以二进制形式存储在这4个字节中
可以通过&运算符获取变量的地址:
c复制printf("a的地址是:%p", &a);
这将输出类似0x004FFA20的地址值。
1.3 指针变量的定义与使用
指针变量是专门用来存储地址的变量。定义指针时需要指定它所指向的数据类型:
c复制int *pa = &a;
这里:
int*表示"指向int的指针"pa是指针变量名&a获取变量a的地址
指针变量本身也占用内存空间(通常4或8字节,取决于系统架构),它存储的是另一个变量的地址。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针的解引用与类型系统
2.1 解引用操作
解引用(dereference)是通过指针访问其所指内存中数据的操作:
c复制int value = *pa; // 等价于 value = a
*pa表示"获取pa指向的内存中的值"。这个操作是类型敏感的,指针的类型决定了如何解释内存中的数据。
2.2 指针类型的权限问题
不同类型的指针解引用时访问的内存范围不同:
c复制int n = 0x11223344;
char *pc = (char*)&n;
