1. 指针的本质与内存视角
指针是C/C++中最强大也最危险的工具之一。要真正掌握指针,必须从计算机内存的底层视角来理解。每个指针变量本质上存储的是一个内存地址,这个地址指向内存中的某个位置。当我们声明int *p时,p本身占用4字节或8字节(取决于系统架构),存储的是一个地址值,而不是实际的数据。
理解指针的关键在于区分"指针本身"和"指针指向的内容"。在32位系统中,指针固定占用4字节;在64位系统中则是8字节。这与指针指向的数据类型无关——char*和double*在相同系统中的大小是相同的。
注意:指针大小与系统架构相关,而非数据类型。这是许多初学者容易混淆的概念。
2. 指针运算的底层机制
2.1 指针加减运算的实际含义
指针加减整数时的行为常让初学者困惑。当执行p + n时,实际增加的字节数是n * sizeof(指向类型)。例如:
c复制int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 假设arr地址为0x1000
p = p + 2; // 实际地址变为0x1008 (0x1000 + 2*4)
这种设计使得指针可以自然地遍历数组元素,也是C语言高效处理数组的底层基础。
2.2 指针减法的实用场景
两个同类型指针相减的结果是它们之间相隔的元素个数,而非字节数。这在计算数组长度或字符串处理时非常有用:
c复制int arr[10];
int *start = arr;
int *end = arr + 10;
size_t length = end - start; // 结果为10
3. 多级指针的解析与应用
3.1 二级指针的实质
二级指针(int **pp)是指向指针的指针,常用于以下场景:
- 动态分配二维数组
- 修改函数外部的指针变量
- 处理指针数组
理解二级指针的关键是明确每一级解引用的含义:
c复制int x = 10;
int *p = &x;
int **pp = &p;
// **pp → *p → x
3.2 多级指针的内存布局
以三级指针为例的内存访问过程:
code复制int x = 42;
int *p = &x;
int
