1. 指针的本质与内存模型
指针是C/C++中最强大也最危险的工具。理解指针的第一步是彻底搞明白它和内存的关系。每次声明一个指针变量时,系统都会分配一块内存来存储地址值,就像酒店前台的房卡存放盒——盒子本身有位置(指针变量的地址),盒子里放的是房卡(目标变量的地址)。
c复制int x = 42; // 在内存0x1000处存放整数42
int *ptr = &x; // ptr变量在0x2000处,存储的值是0x1000
这个简单的例子揭示了指针的三层信息:
- 指针自身的地址(&ptr得到0x2000)
- 指针存储的值(ptr的值是0x1000)
- 指针指向的值(*ptr得到42)
关键认知:指针类型不仅决定了解引用时的解释方式,还决定了指针算术运算的步长。char加1前进1字节,int加1可能前进4字节(取决于平台)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针的四大核心操作
2.1 取址与解引用
&和*就像硬币的两面:
c复制int y = *(&x); // 完全等价于 y = x
但下面这种写法是危险的:
c复制int *wild; // 未初始化的野指针
*wild = 100; // 可能导致程序崩溃
2.2 指针算术运算
指针加减整数时,实际位移量=整数×sizeof(指向类型):
c复制double arr[5];
double *p = arr;
p += 3; // 实际地址增加了3*8=24字节(假设double占8字节)
2.3 指针比较
同数组内的指针比较才有意义:
c复制int nums[10];
int *start = nums;
int *end = nums + 10;
while(start < end) {
*start++ = 0; // 安全清空数组
}
2.4 多级指针
二级指针(int **)常用于动态二维数组或修改指针参数:
c复制void alloc_mem(int **p, size_t size) {
*p = malloc(size); // 修改外部指针的值
}
3. 指针与数组的微妙关系
数组名在多数情况下会退
