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

const限定符指定了一个变量为只读变量,是不容许被改变的,所以const变量在定义时就必须初始化。
const在与指针搭配时,使用将变的复杂和微妙。简单的说const搭配指针就会出现如下三种状况:ide

  • 指向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,不要刻意追求是否正确可执行):wordpress

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);string

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

2.const指针编译

int a=12;
int *const ptr=&aclass

这意味着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;

相关文章
相关标签/搜索