【C++】指针与const

【C++】指针与const

最近学习到C++指针与const这一块,被常量指针和指针常量搞得有点乱,书上也没有解释得很详细,于是决定自己进行一些试验,将结果与个人的理解记录下来,以供大家参考。

1.常量指针

常量指针,也称 指向常量的指针,顾名思义,其所指向的对象是一个常量(但后面我们会说到其实并非如此)。

反过来,一个常量,如果要定义指向他的指针,则必须使用指向常量的指针!

原因:const 声明的常量不允许修改,如果可以用非常量指针指向常量,则常量将可以通过此指针修改,这是不合理的

const int i = 101;    // 定义一个常量
int *p = &i;          // 报错
const int *cp = &i;   // 正确

但是!指向常量的指针,也可以指向一个非常量对象!!!这就是指针类型必须与指向类型严格相同的一个典型特例!

int i = 101;
const int *cp = &i;    // 正确

所以,我认为应该这样理解 常量指针:不允许通过指针修改其指向的对象

言下之意就是说:常量指针所指向的对象(非常量),依旧可以通过其他途径修改,并且常量指针也能够同步这一修改

#include <iostream>

using namespace std;

int main() {
    int i = 1;
    int *p = &i;
    const int *cp = &i;
    *p = 101;    // 如果通过*cp进行修改则会报错
    std::cout << "*p: " << *p << ", *cp: " << *cp << std::endl;
    system("pause");
}

执行输出

*p: 101, *cp: 101

2.指针常量

大家都知道,指针和引用的不同点之一就是——指针自身也是一个对象

既然是对象,那么指针自身也可以被定为一个常量。

而指针存放的是其所指向对象的地址,所以指针被定为常量的后果就是,他存放的地址不能被改变,他 永远只能指向一个对象

这样又对应了指针和引用的另一个不同点——指针在其生命周期内可以指向多个不同的对象。指针常量显然断绝了其三心二意的念想~

int i = 1;
int j = 2;
int *const p = &i;
p = &j;    // 报错

3.指向常量的指针常量

希望大家已经完全理解了上面的内容,下面可能要开始打架了......

不过如果牢记上面划线的定义,我相信还是能把常量指针和指针常量很好地区分开的~

指向常量的指针常量,按照上文的理解,首先他只能永远指向一个对象,其次你不能通过他修改对象。

这就有点像提供了一个对象的 Getter(有点的吧...?)

换一个角度想,我们还能得到以下一些想法:

  1. 常量指针在其生命周期内可以指向不同的对象
  2. 指针常量允许使用者使用他对其所指向的对象进行修改
  3. 如果想让一个指针永远指向一个常量,我们必须使用指向常量的指针常量

4.顶层/底层const

顶层const:表示对象是一个常量

底层const:表示复合类型指向的对象是一个常量

// 顶层const示例

const int ci =1;

int i = 101;
int *const cp = &i;

const int *const ccp = cp;    // 靠右的是顶层const
// 底层const示例

const int ci = 101;    // 这个是顶层const
const int *p = &ci;
const int &r = ci;

const int *const ccp = p;    // 靠左的是底层const

当执行拷贝(赋值)操作时,顶层const几乎不受限制,而=两边的对象则要求拥有相同的底层const资格!一般来说,非常量可以转化成常量,而反过来则不行!

int i = 1;
const int ci = 101;

const int &r = ci;
int *const p = &i;
const int *cp = &ci;
const int *const ccp = cp;

cp = ccp;        // 正确:顶层const无影响
int *p2 = p3;    // 错误:底层const资格不一致
cp = &i;         // 正确:int* 能转成 const int*

梳理了一下,自己也清晰了不少,希望对大家也有所帮助~

参考书目:Primer C++ 第五版(中文)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值