const 放在 * 左边还是右边,决定了谁被限定为只读。这是C/C++指针中最核心的概念之一。
⚡️ 核心区别速查
| 写法 | 含义 | 可读性口诀 |
|---|---|---|
const int *p |
指向的值不可改,指针本身可以改 | const 在 * 左 → 锁数据 |
int * const p |
指针本身不可改,指向的值可以改 | const 在 * 右 → 锁指针 |
const int * const p |
值和指针都不可改 | 两边都有 → 全锁 |
💡 黄金法则(从右向左读) :
遇到
const,看它修饰的是谁。const紧邻*左侧修饰数据,紧邻*右侧修饰指针变量本身。
🔍 详细对比
1. const int *p(常量指针 / Pointer to const)
c
const int *p = &a;
*p = 10; // ❌ 编译错误!不能通过p修改指向的值
p = &b; // ✅ 合法!p可以指向别的地址
-
典型用途 :函数参数中防止意外修改传入的数据
cvoid print(const char *str); // 承诺不会修改str指向的字符串
2. int * const p(指针常量 / Const pointer)
c
int * const p = &a;
*p = 10; // ✅ 合法!可以通过p修改值
p = &b; // ❌ 编译错误!p不能再指向别处
-
典型用途 :硬件寄存器映射、固定缓冲区指针
cint * const UART_REG = (int *)0x40001000; // 永远指向这个地址
3. const int * const p(双重锁定)
c
const int * const p = &a;
*p = 10; // ❌ 不能改值
p = &b; // ❌ 不能改指向
⚠️ 常见误区澄清
| 误区 | 正解 |
|---|---|
"const int *p 和 int const *p 不同" |
❌ 完全相同! const 在类型名前后等价 |
"const 放在最左边就一定是修饰数据" |
✅ 对 const int *p 成立,但要记住本质是 const 与 * 的相对位置 |
"int const * const p 语法错误" |
❌ 合法!等价于 const int * const p |
🧠 终极记忆技巧:"左数右针"
const int * p;
^^^^^^^^ ← const在*左边 → 锁定"数"据
int * const p;
^^^^^ ← const在*右边 → 锁定"针"指
或者用从右向左阅读法解析任何复杂声明:
const int * const p
↑ ↑
"指向const int" "p本身是const"
→ p是一个const指针,指向const int