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






完。

相关文章
|
20天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
40 7
|
5天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
26 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
62 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
44 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
55 3
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值