C++常指针与指向常对象指针的区别详解

咖啡半糖
咖啡半糖
发布时间:2026-10-14 | 2人浏览过
原创

C++中的指针修饰符 `const` 放置位置不同会导致完全不同的语义。区分“指向对象的常指针”与“指向常对象的指针”,关键在于理解谁被约束为只读:是指针本身的地址值,还是指针所指向的对象数据。

结果或目标

掌握 C++ 中两种特殊指针的定义语法、行为差异及在实际开发中的应用场景,确保代码逻辑符合预期且具备安全性。

准备条件

具备 C++ 基础语法知识,熟悉类(Class)、对象实例化及指针的基本操作。了解 `const` 关键字的基本含义。

真实操作顺序:理解核心概念

第1步:理解指向对象的常指针(Pointer to Object, Constant Pointer)

目的:确保指针变量一旦初始化后,其存储的地址值固定不变,始终指向同一个对象实例。

入口与动作:将 `const` 放在指针符号 `*` 的右侧。

重要参数/语法:

类名 * const 指针变量 = &对象;

关键特性:

  • 指针本身不可变:指针的值(即内存地址)不能被改变。这意味着你不能让该指针去指向另一个对象。
  • 对象内容可变:只要对象中的数据成员不是 `const` 类型,你完全可以通过该指针修改对象内部的成员变量值。

代码示例:

复制代码 代码如下:
Time t1(10, 12, 15);
Time t2;
Time * const ptr1 = &t1;
// ptr1 = &t2; // 错误!编译报错:无法修改 const 指针的值
ptr1.hour = 11; // 正确:可以修改指向对象 t1 的数据成员

应用场景:常用于函数形参。当希望防止函数内部意外修改指针本身的指向(例如防止意外重新分配或指向其他无关对象),但不需要保护对象内容不被修改时使用。

第2步:理解指向常对象的指针(Pointer to Const Object)

目的:确保通过该指针访问时,不能修改其所指向的对象的任何数据,从而保护数据的只读属性。

入口与动作:将 `const` 放在指针符号 `*` 的左侧,通常放在类型声明之前。

重要参数/语法:

const 类名 * 指针名 = &对象;

关键特性:

  • 对象内容不可通过指针修改:即使原对象是非 `const` 的,一旦通过此指针访问,也不能修改其成员变量。
  • 指针本身可变:指针变量的值可以改变,即它可以重新指向另一个同类型的对象。
  • 指向限制:常对象只能由指向常对象的指针指向。非 `const` 对象可以由它指向,但此时被视为只读。

代码示例:

复制代码 代码如下:
// 定义常变量
const int a = 5;
const int *p = &a; 
// p = &a2; // 假设 a2 存在,这是合法的,指针可以改变指向
// *p = 6;   // 错误!不能通过指针修改常量的值
复制代码 代码如下:
class Time {
public:
    int hour, minute, second;
};

const Time t1;
const Time *p = &t1;
p->hour = 10; // 错误!试图通过指向常对象的指针修改内容

应用场景:最常用于函数形参,目的是保护传入的对象数据不被函数意外修改。这是编写安全 API 的最佳实践。

第3步:对比辨析易混点

初学者最容易混淆这两者的定义顺序和实际权限。请记住一个简单的口诀:
`*` 右边是 `const`,指的是指针常量(指针本身不可变);
`*` 左边是 `const`,指的是指向常量的指针(所指内容不可变)。

具体对比如下表所示:

第4步:综合验证与常见误区排错

误区1:认为常对象可以由普通指针指向。
事实:常对象只能由指向常对象的指针指向。若尝试用 `Time *p = &t1;`(其中 t1 是 const Time)编译会报错,因为存在从 `const` 到非 `const` 的降级风险。

误区2:忽略初始化要求。
对于“指向对象的常指针”(`T * const`),必须在定义时进行初始化。因为其值不可变,若不初始化则无有效地址可用,导致编译错误。

混合情况:如果写成 `const T * const p`,则表示既不能修改指针本身,也不能通过指针修改对象内容。这是最严格的指针类型。

完成判断

当你能够准确写出这两种指针的定义,并解释清楚为何 `ptr=&obj2` 对其中一种合法而另一种非法,以及为何 `*ptr=value` 对其中一种合法而另一种非法时,即标志着已掌握该知识点。

简要总结

在 C++ 开发中,正确使用 `const` 修饰指针是提高代码健壮性的关键。
- Time * const p:p 是常量,只能指向一个固定的对象,但可以修改该对象的内容。
- const Time * p:p 指向的内容是常量,不能通过 p 修改对象内容,但 p 可以指向其他对象。

以上就是C++中指向对象的常指针与指向常对象的指针的详细讲解,更多关于C++指针用法的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表