1. 指针的本质与内存模型
指针是C/C++中最强大也最危险的工具。理解指针的第一步,就是把它看作内存地址的具象化表示。每个指针变量存储的是一个内存位置的编号,就像快递柜的柜门号码。
在32位系统中,指针固定占4字节;64位系统中则是8字节。这个大小与指针指向的数据类型无关,因为地址编号的长度是固定的。我们可以用sizeof验证:
c复制printf("%zu\n", sizeof(int*)); // 输出8(64位系统)
printf("%zu\n", sizeof(char****)); // 同样输出8
注意:指针大小与编译目标平台相关,嵌入式开发中可能遇到特殊架构的指针尺寸。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针声明的语法陷阱
指针声明中的星号(*)位置常常让初学者困惑。以下三种写法是等价的:
c复制int* p;
int *p;
int * p;
但遇到多重指针时,星号的绑定关系就变得关键:
c复制int* p, q; // p是指针,q是普通int
int *p, *q; // 两个都是指针
3. 指针运算的底层逻辑
指针加减法的步长由指向类型决定:
c复制int arr[5];
int *p = arr;
p++; // 实际地址增加sizeof(int)字节
这种特性使得指针运算成为遍历数组的高效方式:
c复制for(int *iter = arr; iter != arr+5; ++iter) {
printf("%d\n", *iter);
}
4. 野指针与空指针的实战处理
野指针(未初始化指针)是C/C++程序崩溃的常见原因。防御性编程建议:
c复制int *p = NULL; // 显式初始化为空
if(p != NULL) {
*p = 42; // 使用前检查
}
重要技巧:在Linux环境下,可以通过mmap将NULL页面映射为只读,这样解引用NULL指针会触发段错误而非静默失败。
5. 多级指针的应用场景
二级指针常用于修改函数外部的指针变量:
c复制void alloc_mem(char **p, size_t size) {
*p = malloc(size);
}
char
