char const *p (1) //常量指针
const char *p (2) //常量指针
char * const p (3) //指针常量
(1)、(2)是一样的,p是“指向常字符的指针”,重点在“常字符”上了,既然指向的是常字符,那么指向的那个单元地址的内容是不可变的。但是p指向的地址是可变的。(注意p必须初试化)。如下:
char a = 'a ' ;
char b = 'b ' ;
char const * p = &a;
*p = 'A ' ; // 错误,试图改变指针p所指的地址单元内容
p = &b ; // 正确,可以改变指针p指向的地址
*p = 'B ' ; // 正确,b不是常字符,所以可以改变其内容
而(3)和(1)、(2)不一样,这里的P是“指向字符的常指针”,重点在“常指针”。它指向的地址不可变,但是地址里的内容可变。这里的p也必须初试化。如下:
char a = 'a ' ;
char b = 'b ' ;
char * const p = &a ;
*p = 'A ' ; // 正确,可以改变p所指向的地址单元的内容
p = &b ; // 错误,试图改变p所指向的地址