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

作者:teeyohuang

邮箱:teeyohuang@163.com

本文系原创,供交流学习使用,转载请注明出处,谢谢

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值