您的位置:首页 > 编程语言 > C语言/C++

C++问题小结--2.通过几个例子谈谈const与*

2016-04-14 09:51 323 查看
const在C++里能够封锁参数,修饰函数,修饰返回值


首先,清楚一个概念,比如说我们定义了一个char类型的指针
char *p
,那么,在这里,p是一个char *类型的指针。p指的是p指针的指向的地址,
*p
是这个指针的指向空间的内容(或者说是指针所指向空间的值)。

char *p = &i;  //那么这里*p存的是这个i变量的值;




下面让我们从几个例子入手理解const的位置放置的不同引起的含义的不同:

int *p;
const int * p;
int const * p;  //第一二行是等价的
int * const p;
const int * const p;


这里有一个简便方法用来区分这几条语句



(1)
const int *p = &a;


表示:p的指向空间的内容(或者说指针所指向空间的值)不能被修改,或者说:这个指针所指向的空间的内容不可通过改变*p的值来改变(个人觉得后者描述更加准确具体一些)(图一)。当然,a的值可以改变,但是a的值改变,却仍然不能改变p所指向的地址(图二)。如图:(
int const *p = &a;
与之等价,不在赘述。)

图一:



图二:



p的地址仍然是0018FF44

(要注意的是p的地址实际上是a的地址,这个容易使人啼笑皆非,但是事实如此



但是上面的例子可以修改p的地址



(2)
int * const p = &a;


表示:p指针的地址不能被修改,或者是说指针的指向不能被修改。但是*p却可以被修改,也就是说p所指向的空间的内容可以被修改。

图三为p最初的地址

图三:



图四试图修改p的地址

图四



但是修改*p却是可以的。(如图五)

图五:



(3)
const int * const p;


表示:第一个const表示p所指向的空间的内容不可以通过*p来修改;第二个const表示p的地址,或者是说指针的指向不能被修改。

至此,const容易混淆的地方我们已经解释清楚,总结一下无非就是:

当const在*的左边,则表示指针所指向的空间的内容不能通过改变
*p
的值来修改,或者说指针所指向空间的值不能被修改。

当const在*的右边,则表示指针的地址不能被修改,或者说指针的指向不能被修改。

值得注意的是下面这段语句里:a的地址即就是指针p的地址。

int *p;
p = &a;


这个主要应用在C++中的this指针这块



如上图,类中所定义的函数貌似只有三个参数,实质上有四个,第四个是什么呢?那就是我们的this指针,这个参数是这样定义的
CGoods *const this
,这里就用到了我们今天谈到的const类型的用法,它使得this指针的地址无法改变,达到封锁参数的目的,这样就打消了修改this指针的念头。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: