您的位置:首页 > 其它

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

2015-08-30 20:38 274 查看
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[0]);


所以,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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: