C/C++ 指针核心全景指南

核心维度 · 语法示例 · 形式化说明 · 交互动画

1. 基础寻址

取地址与解引用

核心机制
指针 p 存储 x 的地址。*p 是通往 x 的'传送门'。
Syntax / Example
1int *p = &x;
2*p = 100;

指针算术运算

数组遍历基础
p++ 不是加 1,而是跳过一个数据单位(sizeof(type))。
Syntax / Example
1p++;
2p + 5;

2. 函数交互

传址调用 (Pass-by-Address)

高效传递大数据结构
打破作用域限制。允许被调用的函数直接修改主调函数中的变量值。
Syntax / Example
1void func(int *ptr)
2// 调用: func(&x)

函数指针 (Function Pointer)

代码即数据
指向函数的指针,常用于实现通用算法(如 qsort)的回调函数。
Syntax / Example
1int (*cmp)(void*, void*);
2cmp = &compare_int;

指针作为返回值

警惕悬空指针
从函数中带回一个地址(通常是堆内存或静态变量地址,严禁返回局部变量地址)。
Syntax / Example
1int* func() { ... }

3. 数据结构

结构体成员访问 (->)

操作符: ->
等价于 (*ptr).member。专门用于结构体指针访问其内部成员的语法糖。
Syntax / Example
1ptr->member

数组退化 (Array Decay)

sizeof(arr) vs sizeof(p)
在表达式中,数组名 arr 隐式转换为指向数组第一个元素的指针 &arr[0]。
Syntax / Example
1int arr[10];
2int *p = arr;

字符串字面量

只读区域
指针指向只读数据段(.rodata)。尝试修改 *s 会导致段错误。
Syntax / Example
1char *s = "Hello";

4. 动态内存

泛型指针 (Void Pointer)

malloc 的返回类型
类型擦除。它可以持有任何类型的地址。使用前必须强制转换(cast)为具体类型。
Syntax / Example
1void *ptr;

堆内存管理

需手动 free
动态请求内存。指针是访问这块"匿名"内存的唯一句柄。
Syntax / Example
1p = malloc(sz);
2free(p);

动态二维数组 (Method 4)

需要多次 malloc/free
常通过分配指针数组,再让每个指针指向一维数组来模拟二维数组。
Syntax / Example
1int **p = malloc(rows * sizeof(int*));

5. 类型限定

常量指针 (Pointer to Const)

保护数据内容
只读视图。p 可以指向别处,但不能通过 *p 修改目标值。
Syntax / Example
1const int *p;

指针常量 (Const Pointer)

固定地址
固定指向。p 一旦初始化就不能指向别处,但可以通过 *p 修改目标值。
Syntax / Example
1int * const p = &x;

6. 字符串与多维数组

字符串复制惯用法

经典 C 风格
利用指针后增量运算的优先级,实现紧凑的数组/字符串复制循环。
Syntax / Example
1while(*s != '\0') 
2  *d++ = *s++;

多维数组寻址

指针的指针概念
二维数组是指向数组的指针。先偏移行(arr+i),解引用得到行地址,再偏移列(+j)。
Syntax / Example
1arr[i][j] 
2// 等价于
3*(*(arr + i) + j)