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

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

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

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

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

例子:

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的指针,

const int month= 6;
const int * pt2 = & month;

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

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

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

    例如:

const int day= 3;
int * pt3 = & day; //不合法

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

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

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

2、指针本身声明为常量

       来看两个语句:

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 的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cs

c++15.0 RTTI机制, 类型转换操作, 表达式类型推断与获取

---- c++的语法,我准备要结束了,c++东西还有很多,比如多线程,c11新特性等,我不是很熟,以后有时间在补充吧。准备写c#了,原本准备开始java语法的...

3768
来自专栏HappenLee的技术杂谈

C++雾中风景3:const用法的小结

const关键字,翻译成中文是常量,常数的意思。所以在绝大多数场合之中,const是来定义常量的,定义常量也是好的编程习惯。在C类语言之中,定义常量通常会使用宏...

1023
来自专栏我和我大前端的故事

深入了解原型

说原型之前先说说对象,好像在工作中,对象用的挺多的,原型基本上没有用。既然没有用那我还要不要学习呢?思考了很久,还是学一学,万一以后的工作用的着呢?领导常说,上...

793
来自专栏静晴轩

59分钟学会正则表达式

推荐几个正则表达式编辑器 Debuggex PyRegex Regexper 正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则...

3745
来自专栏IT派

Java面试中常被问到的几大技术难题

大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到的...

1110
来自专栏水击三千

JavaScript操作符(关系操作符、相等操作符和条件操作符)

关系操作符用于对两个值进行比较,返回一个布尔值。关系操作符包括大于(>),小于(<),大于等于(>=),小于等于(<=)。当关系操作符用于非数值时,也要先进行数...

2369
来自专栏奔跑的蛙牛技术博客

java基本程序设计

保护对象实例域,提供黑盒的概念保护数据域的安全,体现了面向对象思想。数据>算法的思想

842
来自专栏互联网杂技

深入理解javascript原型和闭包(1)——一切都是对象

“一切都是对象”这句话的重点在于如何去理解“对象”这个概念。 ——当然,也不是所有的都是对象,值类型就不是对象。 首先咱们还是先看看javascript中一个常...

36016
来自专栏个人随笔

房上的猫:类的无参方法

一.类的无参方法  1.概述:   (1)类是由一组具有相同属性和共同行为的实体抽象而来的   (2)对象执行的操作是通过编写类的方法实现的   (3)类的每一...

36813
来自专栏老九学堂

最新Java高薪面试题+答案+解析!

今天老九君给大家分享一些Java面试需要的题目哟~ 01 anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类,是否可以im...

4347

扫码关注云+社区