C指针-const char* p到底是什么不可以改变

char a = 'w';
char b = 'q'; const char* p = &a;
p = &b;
printf("%c",p[0]);

如上一段代码,最终代码输出q。不是有const修饰嘛?为什么仍然可以改变哪?

指针存在的价值在于让我们修改。如一下代码:会报一个警告deprecated conversion from string constant to 'char*' [-Wwrite-strings]

	char *msg;
msg = "hello";

因为指针是修改,char *背后的含义是:给我个字符串,我要修改它。所以应该给msg赋值一个地址,而不是一个常量字符串。如果确实给msg一个常量字符串,则会出现莫名错误,在Eclipse下自己退出,如下程序,是无运行的。

    char *msg;
msg = "hello";
msg = "good-bye";
*msg = 'w';

好,接着说const的问题。const char* p = &a;这句话的意思是*p指向&a,且*p有只读权限,不能通过*p修改a的内容。当然仍然可以通过a直接修改内容。

const char*  p ;
p = &a;
a = 'k';
//p = &b;
//*p='k';
printf("%c",p[]);

所以,const的问题是,值通过指针对内存有什么样的操作权限。char*p,可以做任何操作。const char *p 对这一块内容只能读。

 对于char **pp,pp的类型为指向char型的指针的指针;
 而const char ** cpp呢,根据前面关于const的说明,这里的const仍然是修饰的是char,那么cpp的类型为指向const char型的指针的指针。因此pp和cpp完全是两个不同的类型的指针,所以会产生warning。
 
char * const *cpp 与 const char ** cpp,类型完全不同。后者前面已经说了。前者的类型为,指向char的常量指针的指针。也就是cpp的类型为指向常量T3的指针,而T3为指向char 型的指针。这时cpp与pp的指向的类型仅限于限定符的不同,因此可以将pp赋给cpp。
 
上一篇:Java获取资源路径——(八)


下一篇:Beta阶段敏捷冲刺五