1. 指针的本质与内存基础
指针是C/C++语言中最强大也最令人困惑的特性之一。理解指针的关键在于先搞清楚计算机内存的工作原理。我们可以把内存想象成一个超大的Excel表格,每个单元格都有唯一的地址(比如A1、B2这样的坐标),而指针就是存储这些地址的变量。
在32位系统中,每个内存地址用4字节表示;64位系统则用8字节。当你声明一个整型变量int num = 42;时,计算机会:
- 在内存中分配4个字节的空间(假设地址为0x7ffeee2b)
- 把值42以二进制形式存入这个地址
- 变量名
num就是这个内存地址的别名
指针变量则专门存储这类地址值。声明int *ptr = #时:
&是取地址运算符,获取num的内存地址*ptr表示ptr是一个指向整型的指针- 指针变量本身也需要内存空间(通常4或8字节)
重要提示:指针类型必须与指向变量的类型严格匹配。
int指针不能指向char变量,否则会导致内存解释错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针的核心操作解析
2.1 声明与初始化
指针声明有几种等效形式:
c复制int* ptr; // 强调ptr是int*类型
int *ptr; // 强调*ptr是int类型
int * ptr; // 较少用
初始化指针的三种正确方式:
- 指向现有变量:
int *p = # - 动态分配内存:
int *p = (int*)malloc(sizeof(int)); - 初始化为NULL:
int *p = NULL;(C++11可用nullptr)
危险操作:
c复制int *p; // 未初始化
*p = 10; // 野指针,可能导致程序崩溃
2.2 解引用与指针运算
解引用(Dereference)是通过指针访问目标值的操作:
c复制int num = 42;
int *p = #
printf("%d", *p); // 输出42
*p = 100; // 修改num的值
指针运算基于指向类型的大小自动缩放:
c复制int arr[3] = {10,20,30};
int *p = arr; // 指向arr[0]
