17370845950

C++中const指针和指向const的指针有什么区别?(代码解析)
const指针指指针本身不可变,指向const的指针指所指内容不可变;前者const在右侧(如int const p),后者const在左侧(如const int p),二者可叠加为const int* const p实现双重只读。

const指针指向const的指针是C++中容易混淆的两个概念,关键区别在于const修饰的是指针本身,还是指针所指向的内容。下面用代码直观说明:

指向const的指针(内容不可改)

语法:const int* p;int const* p;
含义:指针p可以改变(能指向别处),但*p不能被修改(不能通过p改它指向的值)。

示例:

int a = 10, b = 20;
const int* p = &a;
*p = 30;   // ❌ 编译错误:不能通过p修改a的值
p = &b;    // ✅ 合法:p现在指向b

const指针(指针本身不可改)

语法:int* const p = &a;
含义:指针p的地址值固定不变(初始化后不能再指向别的变量),但*p可以修改(能改它原来指向的那个值)。

示例:

int a = 10, b = 20;
int* const p = &a;
*p = 100;  // ✅ 合法:a变成100
p = &b;    // ❌ 编译错误:p不能再指向b

既指向const、又是const的指针(双重不可变)

语法:const int* const p = &a;
含义:p不能换指向,*p也不能被修改——彻底只读绑定。

示例:

int a = 10;
const int* const p = &a;
*p = 20;   // ❌ 错误:不能改内容
p = &a;    // ❌ 错误:不能改指针本身(即使指向同一变量也不行)

记忆小技巧

  • const的位置:紧挨着*左边 → 修饰“指向的内容”;紧挨着*右边 → 修饰“指针本身”
  • 从右往左读更清晰:int const * p → “p是一个指针,指向一个const int”;int * const p → “p是一个const指针,指向int”
  • const在星号左边(如const int*)→ 内容只读;const在星号右边(如int* const)→ 指针只读

基本上就这些。理解核心是分清“谁被const了”——是数据,还是指针变量自己。