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