您的位置:首页 > 其它

关于const与指针搭配使用的一点记录

2011-05-08 21:17 579 查看
const限定符指定了一个变量为只读变量,是不允许被改变的,因此const变量在定义时就必须初始化。

const在与指针搭配时,使用将变的复杂和微妙。简单的说const搭配指针就会出现以下三种情况:

指向const变量(对象)的指针

const指针

指向const变量(对象)的const指针

1.指向const变量(对象)的指针

指针指向了const变量,例如 const int *ptr或者int const *ptr,这两种写法含义一样,这表示const限定了ptr所指向的数据类型,而并非ptr本身。即ptr本身并不是const.可以对ptr重新赋值,无需在定义时初始化。

指向const变量的指针可以指向一个const变量,也可以指向一个非const变量,当然指针类型与变量类型要一致。不管指向了一个const变量还是非const变量,任何企图通过这个指针去修改变量的值都会导致编译错误。同时,const变量只能赋给指向const变量的指针,赋给一个普通变量也是不允许的。


如(代码仅供理解const,不要刻意追求是否正确可执行):

const int *ptr;

int *ptr_1;

const int a=12;

const int b=13;

int c=14;

ptr=&a;/*指向const变量*/

ptr=&b;/*重新赋值指向const变量*/

*ptr=20;/*error,不能通过ptr修改*/

ptr=&c;/*重新赋值指向非const变量*/

ptr_1=&c;/*普通指针指向普通变量*/

ptr_1=&a;/*error,普通指针不能指向const变量*/

《C++ Primer》中对此有详细的解释,尽管不能通过指向const对象的指针去修改基础对象,然而如果该指针指向的是一个非const对象,可以用其他方法修改所指的对象。如下的例子:

const int *ptr;

int *ptr_1;

int c=14;

ptr=&c;

printf("c=%d\n",*ptr);

ptr_1=&c;

*ptr_1=18/*通过非指向const的指针修改*/

printf("c=%d\n",*ptr);

输出结果可以看到两次输出是不一样的。对此,《C++ Primer》中说,如果把指向const的指针理解为“自以为指向const的指针”,这可能会对理解有所帮助。

2.const指针

int a=12;

int *const ptr=&a

这意味着ptr这个指针被定义成const变量,必须在定义时初始化,并不能重新对ptr赋值,即不能将ptr再指向其他变量。但是,*ptr=13,这样的操作完全取决与a是不是一个const变量,在这个例子中不是,所以*ptr=13是正确的,假如a这样定义,const int a=12,*ptr=13会导致错误。

3.指向const变量(对象)的const指针

const int a=12;

const int *const ptr=&a;

这就意味着ptr不能被重新赋值,因为它是const指针,定义时需初始化;同时不能通过ptr修改a,因为a也是const变量。

4.有趣的typedef

typedef string *pstring;

const pstring cstr;

这时,cstr是一个指向string类型的const指针,而不是一个指向const string的普通指针。因为const pstring cstr;,const修饰的是pstring这个类型,而这个类型是一个string指针。其实:

string s;

typedef string *pstring;

/*以下三个定义相同,都是指向string的const指针*/

const pstring cstr1=&a;

pstring const cstr2=&a;

string *const cstr3=&a;

5.记忆方法

记忆方法其实很简单,只需看清const和*的位置就可以,const在前,则是指向const变量的指针,如:

const int *ptr;int const *ptr;

*在前,则是const指针,如:

int *const ptr;

两个const,则是指向const的const指针了,如:

const int *const ptr;

本文出自 “备忘” 博客,请务必保留此出处http://vindo.blog.51cto.com/2990328/561864
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: