Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++随记(五)---const 与 指针

C++随记(五)---const 与 指针

作者头像
TeeyoHuang
发布于 2017-12-28 06:48:14
发布于 2017-12-28 06:48:14
61200
代码可运行
举报
运行总次数:0
代码可运行

C++随记(五)---const 与 指针

const 限定符它把一个对象转换成一个常量,const与define。两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。

const和指针一起用时会有些有趣,我们下面一一分析一下各种情况:

1、指针指向一个常量对象。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int year = 2017;
const int *pt = &year;

这是一个典例,pt 指向一个const int,你可以直接把const int 假装当作是一个类型,就好理解定义的意思了,比如 int * pt = &year;就是pt指向一个int变量的指针, double * pt =&year;就是pt 指向一个double变量的指针,const int * pt = &year; pt就是一个指向 const int的指针。 含义为: 不能通过指针pt来改变year的值!但是!我可以直接通过year本身来改变它的值。

这种操作看起来好像没什么用,但是其实是有用的,比如当用函数中的按地址传递时,我们很多时候就是把变量的地址传入函数中去执行一些操作,这个时候限定我无法用地址来改变一些值就显得很有用处了。后面的博文中有机会会看到这样的例子。

注意:

    ①上面代码的例子,我是将一个常规变量 的地址赋值给了指向const的指针。这是合法的。

    ②还有一种情况,将 const 变量的地址赋值给   指向const的指针,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int month= 6;
const int * pt2 = & month;

    合法的操作,这样我既不能通过month来修改它的值,也不能通过它的地址修改它的值,这样这个变量在正常情况下就形成了“绝对防御”了,我无法改变它的值。

    ③将 常规变量的地址赋值给常规指针,这个就是我们常见的操作,不讨论了;

    ④将 const变量的地址 赋值给 常规变量指针,不合法!!!

    例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int day= 3;
int * pt3 = & day; //不合法

        为什么不合法?因为我第一句已经说了是一个const int,但是如果我允许指针来修改它的值的话,那岂不是实力打脸了? 综上,当变量和指针分别为const情形这2x2=4种情况要区分好。常规指针只能指向常规数据地址。

        将指针参数声明为指向常量数据的指针有两条理由: · 这样可以避免由于无意间修改该数据而导致的编程错误; · 使用const使得函数能够处理const和非const实参,就如我上述①②,否则只能接受非const数据,如情况③。         这里还要注意一点,上述说的是不能通过指针来修改变量,然后也说了可以通过变量本身来修改变量, 但是 还应该补充一点,相信大家也应该会想到这样的情况,就是是否可以修改指针自己的值? 答案是:可以! 也就是不管你变量和指针自己玩的多欢,就是不许你通过指针去修改变量。不管大陆和中国台湾各自玩的多high,就是不许你中国台湾去代表中国搞事情,就是这个意思吧~

        好了说了这么多,来看第二类情况了

2、指针本身声明为常量

       来看两个语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int province = Taiwan;
const int *pt1 = &province;//A
int *const pt2 = &province;//B

好了现在来找不同,很明显A和B两个语句const的位置不一样, 语句A上文已经研究了,指向 const int 的一个指针 pt1,不能通过pt1来修改province 语句B。这里的意思是,声明了一个 指向int 类型的 const 指针 pt2,pt2现在自己都不能修改自己的值了,因为 指针本身被声明为了常量。 所以情况1中,我的用于是指向const对象的指针,强调的是对象是const的,而情况2中,我们就应该说是const指针,因为指针本身是const 的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-06-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++随记(三)---动态分配内存问题(2)
本文讲述了动态分配内存和数组的一些注意事项,包括指针、数组名、数组尺寸等。作者通过举例说明了指针和数组名之间的区别,以及使用sizeof运算符获取数组尺寸的便捷性。同时,文章也提到了使用new运算符动态分配内存时的注意事项,包括指针、数组名、数组尺寸等。
TeeyoHuang
2017/12/28
8830
C++ 指针常量与常量指针
本文介绍了C++指针常量和常量指针的概念、区别以及用法。指针常量声明为const,但常量指针声明为int const *。指针常量不能修改指向的数据,但常量指针可以。此外,常量指针必须初始化,而指针常量可以在声明时初始化。总之,两者在用法上存在一定的区别,需要根据具体情况选择合适的声明方式。"
chaibubble
2018/01/02
1.8K0
C++ 指针常量与常量指针
C语言中函数参数传递的三种方式
(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。 (2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。 (3)传引用,实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。 说几点建议:如果传值的话,会生成新的对象,花费时间和空间,而在退出函数的时候,又会销毁该对象,花费时间和空间。 因而如果int,char等固有类型,而是你自己定义的类或结构等,都建议传指针或引用,因为他们不会创建新的对象。
全栈程序员站长
2022/07/02
4.8K0
C语言中函数参数传递的三种方式
C++之类和对象的使用(三)
对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public:
互联网金融打杂
2018/04/03
9130
C++之类和对象的使用(三)
[基础]《C Primer》笔记(上篇)
要把一个较小的常量作为long类型对待时,可以在值的末尾加上L后缀(小写的l不容易和数字1区分)。在支持long long的系统中,可以在值的末尾加上LL区分long long类型。
TOMOCAT
2020/06/09
2.2K0
[基础]《C Primer》笔记(上篇)
C/C++ const
const是C语言的关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。当const与指针、引用、函数等结合起来使用时,情况会变得更加复杂。下面将从七个方面总结const的用法。
恋喵大鲤鱼
2018/08/03
9430
C:数组与指针,指针与const
我们都知道一个指针是代表的一个地址,指针,顾名思义,指向一块区域。那么数组呢?数组并不是代表一堆变量,数组其实也是一种指针,指向一个地址,一般是指向数组的首地址,也就是 a[0]的地址。 a==&a[0] a 是一个指针,指向数组 a 的首地址。 下面四种函数原型都是等价的,第一个参数均为一个地址(指针)。 若定义 int a[10];
字节星球Henry
2021/08/09
8530
const括号前括号后
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数
ljw695
2024/10/18
1340
const括号前括号后
C++中指针和引用的区别
指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指的对象。 不存在指向空值的引用,但是存在指向空值的指针。 注意:引用作为函数参数时,会引发一定的问题,因为让引用作参数,目的就是想改变这个引用所指向地址的内容,而函数调用时传入的是实参,看不出函数的参数是正常变量,还是引用,因此可能引发错误。所以使用时一定要小心谨慎。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改
猿人谷
2018/01/17
5.2K0
与C++类和对象的宿命(下)
• 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后⾯。
Undoom
2024/10/09
2420
与C++类和对象的宿命(下)
c++之指针
在32位操作系统下,无论指针数据类型是什么数据类型,都是占4个字节,而在64位操作系统中占8个字节。
西西嘛呦
2020/08/26
5670
EasyC++28,const和指针
我们知道const关键字修饰的是不可变量,将它和指针一起使用,会有很多微妙的地方。
TechFlow-承志
2022/08/26
1650
C++ 万字长文第一篇---拿下字节面试
有些情况下,基类生成的对象是不合理的,比如动物可以派生出狮子、孔雀等,这些派生类显然存在着较大的差异。那么可以让基类定义一个函数,并不给出具体的操作内容,让派生类在继承的时候在给出具体的操作,这样的函数被称为纯虚函数。含有纯虚函数的类成为抽象类,抽象类不能声明对象,只能用于其他类的继承。 纯虚函数的定义方法为:
syy
2020/08/13
1.6K0
C++ 万字长文第一篇---拿下字节面试
c++ primer2 变量和基本类型。
这四种初始化方式c++11都是支持的。c++11中用花括号来初始化变量得到了全面应用。
和蔼的zhxing
2018/09/04
5490
C++从入门到精通——const与取地址重载
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
鲜于言悠
2024/04/21
2250
C++从入门到精通——const与取地址重载
指针讲解:*&p和&*p 及const的用法总结
一讲到指针,不少同学就会觉得云里雾里。首先要明白,指针和地址是一个概念;然后明白指针和指针变量的区别。
怪兽
2022/10/04
6220
指针讲解:*&p和&*p 及const的用法总结
【C++】类和对象练习——日期类的实现
我们看这个计算出来的日期确实是没问题的,但是d1+100,这里是+而不是+=,所以d1是不是不应该变啊,我们只是把d1+100得到的日期赋给了d2,但是现在d1也变了。 所以我们这样写其实实现的是啥,是不是+=啊。
YIN_尹
2024/01/23
3650
【C++】类和对象练习——日期类的实现
C++基础 杂记(一)
函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但会破坏此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。
xxpcb
2020/08/04
4040
C/C++中const的作用总结
1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态存储区。
_咯噔_
2022/03/08
1.1K0
C++基础知识
static 定义的静态局部变量分配在数据段上,普通的局部变量分配在栈上,会因为函数栈帧的释放而被释放掉。
代码的路
2022/08/23
1.5K0
C++基础知识
相关推荐
C++随记(三)---动态分配内存问题(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验