KyrieChao

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

无。

思考

无。

明日计划

  1. C 语言:指针与函数(指针作参数/返回值)、函数指针、二级指针