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 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

每周四更面试题:True+True=?

面试题:True + Ture == ? Python 的 “+” 号会根据操作对象数据类型的不同而进行重载,操作对象为数字类型时,它是算术运算符;操作对象为序...

1917
来自专栏HappenLee的技术杂谈

C++雾中风景4:多态引出的困惑,对象的拷贝?

上面是两个继承关系的类定义。penguin(企鹅)类继承了bird类。在bird类之中fly()函数是一个virtual函数,它可以被penguin覆盖。我们看...

774
来自专栏desperate633

浅谈javascript中的回调函数javascript中的函数匿名函数回调函数回调函数的使用回调函数实例总结

要理解javascript中的回调函数,首先我们就要对javascript中的函数有一定的理解,所以我们先从javascript中函数谈起,讲讲它与其他语言中的...

782
来自专栏Albert陈凯

scala 隐式详解(implicit关键字)

掌握implicit的用法是阅读Spark源码的基础,也是学习Scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用...

3019
来自专栏互联网杂技

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

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

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

深入了解原型

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

873
来自专栏IT可乐

Java的深拷贝和浅拷贝

  关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷...

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

java基本程序设计

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

862
来自专栏静晴轩

59分钟学会正则表达式

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

3845
来自专栏技术/开源

一道javascript面试题

下面表达式比较的结果分别是什么? 1. []=="0" 2. []==0 3. "0"==0 4. []==false 5. []==[] 大家可以...

22710

扫码关注云+社区