C/C++ 中 const 与指针的组合只有三种形态:

指向 const 的指针

1
const T *ptr;  // 等价于 T const *ptr;
  • 指针指向的数据只读:*ptr = value 报错。
  • 指针本身可变:ptr = &other 合法。
1
2
3
4
int a = 10, b = 20;
const int *ptr = &a;
// *ptr = 15; // 错误
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; // 正确
// ptr = &b; // 错误

典型用途:固定指向某块内存,如数组或全局变量。

const 指针指向 const 数据

1
const T * const ptr = &some_variable;
  • 指针和数据都不可变。
  • 定义时必须初始化。
1
2
3
4
int a = 10;
const int * const ptr = &a;
// *ptr = 15; // 错误
// ptr = &b; // 错误

典型用途:硬件寄存器映射,彻底防止误改。

对比

类型语法指针可变数据可变用途
指向 const 的指针const T *ptr函数参数保护数据
const 指针T * const ptr固定指向地址
指向 const 的 const 指针const T * const ptr完全锁定

记忆技巧

从右往左读声明:

  • const int *ptrptr 是指针,指向 const int
  • int * const ptrptrconst,它是指向 int 的指针。
  • const int * const ptrptrconst,指向 const int

const* 前修饰数据,在 * 后修饰指针。

注意

  1. const int * 可以指向 intconst int;但 int * 不能指向 const int,否则会丢失 const 限定。
  2. T * constconst T * const 必须在定义时初始化。
  3. 多级指针同理:const int **pint * const *p 等按层级分析即可。