C/C++杂谈——指针常量、常量指针

简介: C/C++杂谈——指针常量、常量指针

C/C++杂谈

指针常量、常量指针

有的时候稍不注意就会将两者混淆,即便再去看一下资料,过一段时间又会忘掉,于是今天就用实际代码来看看两者到底有什么区别。

首先,在C/C++中,常量是什么意思?

常量的关键词是const,即,无法被改变。在编译阶段,编译器若发现对常量进行了修改,就会出现提示。基于此,常量在声明时就必须初始化,而且之后都不能改变,见下:

若不初始化:

12eb4c50eed6c5429f8d883cd03bffab.png

若尝试改变:

7f3468f3a001b01d2d8a5e020303b69d.png

ok,现在我们明白了常量是什么意思:初始化之后无法被改变的值。再解决一个小问题:指针是什么?

简单来说,指针就是一个盒子,里边放着一把钥匙,我们可以通过这把钥匙去打开一个对应的保险箱取出东西。

盒子=指针,根据系统位数32/64位数不同,这个盒子的大小可能为4/8字节大小;

钥匙=内存地址,根据系统位数32/64不同,这个钥匙大小也是4/8字节;

那,房间是什么?

保险箱=内存片段,利用钥匙中隐藏至高奥秘——内存地址,访问对应内存地址的内存片段(房间),取出其中的宝藏!

盒子、钥匙、保险箱,这三者哪个能变呢?

答曰:钥匙和保险箱可以变,盒子不能。

为什么盒子不能?

——因为盒子即是指针这个对象自身的地址,在声明这个指针的时候它就已经确定下来了(确定将这个指针盒子“放在”哪个内存位置)。就像下图所示,p1这个指针盒子,自出生的时候,它的位置就已经确定了,不存在重排座次的问题:

b0da82ba7dd1899b0d16a6326585df81.png

慢慢捋一捋,我们能改变的只有盒子里的钥匙和钥匙对应的保险箱。

怎么改变钥匙?

——简单,打开盒子,把钥匙换成其他的就行了,比如:

41c5d5fdc9d5e1bb538b148c747c9418.png

上图p1这个盒子中本来放的打开“1”保险箱的钥匙,被换成打开“2”的了。

PS:new 之后记得delete,例子那么写是会内存溢出的;

怎么改变保险箱?

——在回答之前,我们需要注意,钥匙和保险箱是配套的!如果改变了钥匙,那么打开的保险箱也就不同了,而且保险箱和钥匙本身的对应关系是无法被改变的(一般情况下)。

于是,我们所说的改变“保险箱”,其实说的是改变保险箱里的东西,打开保险箱,把箱子里的东西换一下,见下:

b261e01790ceefd589b74f03c8b58dc3.png

上图,就是打开保险箱,将里边存的“一指禅”换成了“二指禅”!

好了好了,回到正题,什么是指针常量和常量指针?

指针常量是指针本身是常量

这不废话嘛,刚刚不是才说指针这个盒子是不能变的嘛!?

且慢,这里说的“指针本身是常量”,是说指针内部存的钥匙是无法改变的!你想想,盒子不变+盒子里的钥匙不变,不久等于指针不变么?

常量指针是指针指向的常量

此话可解?

——(都说了只有钥匙和保险箱可以变,前面已经提到了钥匙不变的情况,所以…)常量指针是说钥匙对应的保险箱,它里面的东西不能变!保险箱一开始存的是“一指禅”,到死也只能是“一指禅”!

来看看下面两个例子,想一想哪一个是指针常量,哪一个是常量指针?

28984bd82d64ede30cdf07c50cbbb23b.png

a08a89181f739ad6328f4d21b7e3d5ec.png

好好结合刚刚那几句话——钥匙、盒子、保险箱,应该就很简单了。

图一是常量指针,不能改变保险箱里的东西,但是——可以改变盒子里的钥匙;

图二是指针常量,不能改变盒子里的钥匙,但是——可以改变保险箱里的东西;

这两个东西语法上怎么定义的?

简单,看看const之后跟的是什么就可以了,跟的*,那就是常量指针,否则是指针常量,如下:

int* const p1=new int(1);

上面是指针常量,下面都是常量指针:

int const *p1=new int(1);
const int *p1=new int(1);





上面是指针常量,下面都是常量指针:



int const *p1=new int(1);

const int *p1=new int(1);






完。

相关文章
|
19天前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
21 1
|
19天前
|
数据采集 存储 编译器
this指针如何使C++成员指针可调用
本文介绍了C++中的this指针,它是一个隐藏的指针,用于在成员函数中访问对象实例的成员。文章通过代码示例阐述了this指针的工作原理,以及如何使用指向成员变量和成员函数的指针。此外,还提供了一个多线程爬虫示例,展示this指针如何使成员指针在对象实例上调用,同时利用代理IP和多线程提升爬取效率。
this指针如何使C++成员指针可调用
|
5天前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
32 5
|
4天前
|
C++ 容器
【编程技巧】 C++11智能指针
C++11引入了智能指针以自动管理内存,防止内存泄漏和悬挂指针: - `shared_ptr`:引用计数,多所有权,适用于多个对象共享资源。 - `unique_ptr`:独占所有权,更轻量级,适用于单一对象所有者。 - `weak_ptr`:弱引用,不增加引用计数,解决`shared_ptr`循环引用问题。 ## shared_ptr - 支持引用计数,所有者共同负责资源释放。 - 创建方式:空指针、new操作、拷贝构造/移动构造,以及自定义删除器。 - 提供`operator*`和`operator->`,以及`reset`、`swap`等方法。 ## unique_ptr
|
7天前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
5天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
7 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
7天前
|
设计模式 C++ 开发者
C++一分钟之-智能指针:unique_ptr与shared_ptr
【6月更文挑战第24天】C++智能指针`unique_ptr`和`shared_ptr`管理内存,防止泄漏。`unique_ptr`独占资源,离开作用域自动释放;`shared_ptr`通过引用计数共享所有权,最后一个副本销毁时释放资源。常见问题包括`unique_ptr`复制、`shared_ptr`循环引用和裸指针转换。避免这些问题需使用移动语义、`weak_ptr`和明智转换裸指针。示例展示了如何使用它们管理资源。正确使用能提升代码安全性和效率。
14 2
|
13天前
|
安全 数据库连接 C++
C++一分钟之-C++中的常量与宏定义
【6月更文挑战第18天】**C++编程中,常量(`const`和`constexpr`)确保值不变,用于配置、计算和逻辑控制。宏定义是预处理阶段的文本替换,适用于条件编译和简化代码。注意`const`的正确使用,避免过度的`const_cast`。宏可能导致命名冲突、副作用和类型安全问题,应谨慎使用。优选类型安全的常量定义,以提升代码质量和可维护性。**
26 5
|
12天前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
26 3
|
16天前
|
编译器 Linux C++
C++智能指针
**C++智能指针是RAII技术的体现,用于自动管理动态内存,防止内存泄漏。主要有三种类型:已废弃的std::auto_ptr、不可复制的std::unique_ptr和可共享的std::shared_ptr。std::unique_ptr通过禁止拷贝和赋值确保唯一所有权,而std::shared_ptr使用引用计数来协调多个指针对同一资源的共享。在C++17中,std::auto_ptr因设计缺陷被移除。**