现在的位置: 首页 > 综合 > 正文

指针和const的那些事

2013年10月22日 ⁄ 综合 ⁄ 共 1108字 ⁄ 字号 评论关闭

在C++中,指针是个比较让人头疼的东西,把指针和const限定符放在一起,显得更难以理解,最近看《C++ Primer》关于这方面的内容有一点心得,和大家分享一下。长话短说,下面进入正题。

从大的方面讲,指针和const可以构成“指向const对象的指针”和“const指针”。

首先来看“指向const对象的指针“,从字面的意思不难知道,这个const修饰的是对象,而不是指针本身,我们来做具体的分析。

const int v=10;
const int *cp=&v;


上面两行代码指出了“指向const对象的指针”的基本用法,cp指向的是一个const对象,而如果v在定义的时候没有const修饰时,还能用cp指向它吗?即下面的代码正确吗?

答案是肯定的,因为编译器不会去检查v是const的还是非const的,默认地把cp所指向的对象都视为const。所以我们把“指向const对象的指针”理解为“自以为指向const对象的指针”更为合适。

既然cp所指向的对象是const的,那么意味着对象的值不可修改,因此*cp=10;这种语句肯定是错误的了。

再来看看const指针,基本定义和用法如下:

int v=10;
int *const cp=&v;

很显然,const指针中的const是用来修饰指针的,指针一旦指向了某个对象,那么它就不能指向另一个对象,因此类似于cp=&v1;这种语句肯定是不能通过编译的,而对象不是const的,它的值就是可以改变的,*cp=20;这种语句就是正确的了。

在此基础上,我们有可以引入”指向const对象的const指针“也就是说,指针和对象都是const的,看下面的例子:

const double pi=3.14;
const double *const cp=π

这种用法中指针和对象都是不可修改的。

我们再来看一个引入typedef的更为复杂的例子:

typedef string *pstring;
const pstring cstr;

上面的例子中变量cstr是什么类型?

首先,我们可以说*pstring和string是等价的,那么pstring是个什么东西,我们可以这样想,经过解引之后与string等价,那么pstring可以理解为是个指针类型,并且是个指向string类型的指针类型(我们可以这样去理解),pstring前面再加上一个const,不就是const指针类型吗?cstr自然就是一个指向string类型const指针了。

讲了这么多,谈谈如何记忆吧:const和指针放在一起,const在*前面时说明指针指向的变量不能变,也就是不可以修改*p;const在*后面时,说明指针本身不可以变,不能指向其他地方。

抱歉!评论已关闭.