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

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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章