C/C++ 中 const 与指针的组合只有三种形态:
指向 const 的指针
- 指针指向的数据只读:
*ptr = value 报错。 - 指针本身可变:
ptr = &other 合法。
1 2 3 4
| int a = 10, b = 20; const int *ptr = &a;
ptr = &b;
|
典型用途:函数参数只读访问,如 void printValue(const int *p)。
const 指针
1
| T * const ptr = &some_variable;
|
- 指针本身不可变:
ptr = &other 报错。 - 指向的数据可变(前提是数据本身不是
const)。 - 定义时必须初始化。
1 2 3 4
| int a = 10, b = 20; int * const ptr = &a; *ptr = 15;
|
典型用途:固定指向某块内存,如数组或全局变量。
const 指针指向 const 数据
1
| const T * const ptr = &some_variable;
|
1 2 3 4
| int a = 10; const int * const ptr = &a;
|
典型用途:硬件寄存器映射,彻底防止误改。
对比
| 类型 | 语法 | 指针可变 | 数据可变 | 用途 |
|---|
| 指向 const 的指针 | const T *ptr | 是 | 否 | 函数参数保护数据 |
| const 指针 | T * const ptr | 否 | 是 | 固定指向地址 |
| 指向 const 的 const 指针 | const T * const ptr | 否 | 否 | 完全锁定 |
记忆技巧
从右往左读声明:
const int *ptr:ptr 是指针,指向 const int。int * const ptr:ptr 是 const,它是指向 int 的指针。const int * const ptr:ptr 是 const,指向 const int。
const 在 * 前修饰数据,在 * 后修饰指针。
注意
const int * 可以指向 int 或 const int;但 int * 不能指向 const int,否则会丢失 const 限定。T * const 与 const T * const 必须在定义时初始化。- 多级指针同理:
const int **p、int * const *p 等按层级分析即可。