2026-08-17 周一 · 指针(进阶)
2026-08-17
技术
C 语言
学习内容:指针(进阶)
指针常量与常量指针
三者区别核心在"谁是不能被改的":
| 类型 | 定义 | 指针本身 | 指向的数据 |
|---|---|---|---|
| 指针常量(constant pointer) | int* const p2 = &a; |
常量(不可改指向) | 变量(可 *p2 = 5) |
| 常量指针(pointer to constant) | const int* p3 = &a; |
变量(可 p3 = &b) |
常量(不可 *p3 = 5) |
| 常量指针常量(constant pointer to constant) | const int* const p4 = &a; |
常量 | 常量 |
区分秘诀:从左向右读,碰到
const读"常量",碰到*读"指针"。const int* p与int const* p完全等效。
指针的相关运算
- 指针 ± 整数:按基类型宽度偏移(不是按字节)。
p1 + 1偏移一个int的宽度。 - 同类型指针相减:结果为距离,单位是基类型宽度(元素个数),不是字节数。
- 指针强制类型转换:转换基类型,指针的值不变,但解引用时对内存的解释方式变了。如
int i = 0x364241;,用char*解引用读到'A'(0x41),用short*读到 16961。
数组与指针
- 指针数组:元素是指针的数组,本质是数组。
int* ps[5],每个元素是int*。 - 数组指针:指向数组的指针,本质是指针。
int (*pa)[5],指向整个int[5]数组,(*pa)[3] = 9即nums[3] = 9。 - 数组名 = 首元素指针:
nums等效于&nums[0],与&nums值相同但基类型不同(前者指向元素,后者指向整个数组)。 - 下标运算本质是指针运算:
a[n]完全等效于*(a+n)。
记忆技巧:
[]优先级高于*,所以int* ps[5]先结合[]是数组;int (*pa)[5]用括号让*先结合,是指针。
Rust
无。
思考
无。
明日计划
- C 语言:指针与函数(指针作参数/返回值)、函数指针、二级指针