18.指针常量和常量指针

2026-01-23
1011 字 · 5 分钟

🔬 指针常量和常量指针

📖 内容概览

指针常量和常量指针是 C/C++ 语言中两个容易混淆的重要概念,它们都涉及指针和常量的组合使用,但具有不同的语义和使用场景。本文将详细解析这两个概念的定义、区别、使用方法和常见误区。

🎯 核心概念

🧩 指针常量(Pointer to Constant)

指针常量是一个指针,它所指向的内存地址不能被修改,但是可以通过该指针来修改所指向的内存区域的值

  • 语法格式类型* const 指针名
  • 本质:指针本身是常量,指向的地址不可变
  • 特性:可以修改指向对象的值,但不能改变指针指向

🧩 常量指针(Constant Pointer)

常量指针是一个指向常量对象的指针,通过该指针不能修改所指向的内存区域的值,但是指针本身可以指向其他地址

  • 语法格式const 类型* 指针名类型 const* 指针名
  • 本质:指向的对象是常量,值不可变
  • 特性:不能修改指向对象的值,但可以改变指针指向

💡 代码示例

📝 指针常量示例

int a = 10;
int b = 20;
int* const p = &a; // 指针常量p只能指向a
*p = 30; // ✅ 可以修改p所指向的a变量的值
// p = &b; // ❌ 错误:不能改变p所保存的地址

📝 常量指针示例

const int* p1 = &a; // 常量指针p1指向a
// *p1 = 20; // ❌ 错误:不能通过p1来修改a的值
int b = *p1 + 5; // ✅ 可以通过*p1来读取a当前保存的值
p1 = &b; // ✅ 可以将p1重新指向b

📝 常量指针指向常量

const int a = 10;
const int b = 20;
const int* const p2 = &a; // 指针本身是常量,指向的对象也是常量
// *p2 = 30; // ❌ 错误:不能修改指向对象的值
// p2 = &b; // ❌ 错误:不能改变指针指向

🔍 记忆方法

🔍 从语法上区分

  • 指针常量int* const p → const在*右侧,修饰指针本身,指针是常量
  • 常量指针const int* p → const在*左侧,修饰指向的对象,对象是常量

📊 从读写权限区分

类型指针本身能否修改指向对象能否修改语法格式
普通指针✅ 可以✅ 可以int* p
指针常量❌ 不可以✅ 可以int* const p
常量指针✅ 可以❌ 不可以const int* p
常量指针常量❌ 不可以❌ 不可以const int* const p

⚠️ 常见误区

  1. 语法混淆const int* pint const* p 是等价的,都是常量指针
  2. 初始化要求
    int* const p1; // ❌ 错误:指针常量必须在定义时初始化
    const int* p2; // ✅ 正确:常量指针可以稍后初始化
  3. 类型转换
    int a = 10;
    const int* p1 = &a; // ✅ 正确:普通指针可以转换为常量指针
    int* p2 = p1; // ❌ 错误:常量指针不能直接转换为普通指针
    int* p3 = const_cast<int*>(p1); // ✅ 正确:需要使用const_cast进行转换

📋 总结

  • 指针常量:指针本身是常量,指向的地址不可变,但可以修改指向对象的值
  • 常量指针:指向的对象是常量,值不可变,但指针本身可以指向其他地址
  • 区分方法:const在*左侧修饰指向对象,const在*右侧修饰指针本身
  • 使用场景
    • 指针常量适用于需要固定指向某个对象,同时可以修改该对象的场景
    • 常量指针适用于需要保护指向对象不被修改,同时可以改变指向的场景 理解指针常量和常量指针的区别对于编写安全、高效的C++代码至关重要,尤其是在涉及指针操作的复杂程序中。

Thanks for reading!

18.指针常量和常量指针

2026-01-23
1011 字 · 5 分钟

已复制链接

评论区

目录