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);






完。

相关文章
|
2天前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
11天前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
14 3
|
1月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`->`运算符,可以方便地访问和操作智能指针所指向的对象。
|
1月前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this->name`和`this->age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
2月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
24 1
|
2月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
29 1
|
2月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
2月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
2月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
51 4
|
3月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
29 2