char* p="ddddd";==>const char*p="ddddd";char p[]="ddddd";

来源:互联网 发布:小米note3手机卡网络 编辑:程序博客网 时间:2024/05/01 23:01

自己给自己总结一下:
const char* p: 修饰的是p指向的内容,所以不能*(p+2)='a';
区别于char* const p:修饰的是p指向的地址,地址不可变,但地址中内容仍可改变 

//1
const char* p="dddddd";
*(p+2)='a';//错误,而且编译时就发现,const修饰了p指向的内容不能变.莫非就是传说中的"是静态区域的一个地址,所以不能改变这个地址中的内容"?

//2
char* p="dddddd";
*(p+2)='a';//错误同上,但编译时不能发现,但运行崩愦

//3
char pa[]="dddddd";
*(pa+2)='a';//正确,楼上边有解释.
const char* p=pa;
*(p+2)='a';//错误,而且编译时就能检查出来,原因同1

//4
有没有more effective C之类的书呢?
如liflag888()所说,const char* p="dddddd";这样声明更有助于让编译器发现错误.
 
//5
还有
 char*  func()   
 {   
     //char p[] ="dddd";  //局部
   char* p="dddd";    //长期存在,返回后仍存在,因其在常量区
     return p;     //相当于return   "ddddd";长期存在

  }