字符串
历史遗留问题—— char*-based字符串
这是一个常见(应该说在旧的代码中常见)的字符串赋值语句:
char* str = "abc";
可以看到,这里使用了一个指针指向了一个字符串字面常量(String Literal)。对于不知道它的人来说,可能会有修改它的欲望,但实际上修改它会出现不可预料的后果(不同编译器可能会有不同处理方式),因为我们在尝试修改一个常量!
可是,它不应该是一个变量吗?实际上,我们仔细一看,虽然赋值符号左边是变量,但右边是一个字符串字面常量,把一个字符串字面常量赋给一个指针,想必编译器一定要做一些“小动作”才能实现。
实际上,str指向的是一个常量,这个常量的类型是const char[]
,所以修改它会出现严重的错误(程序崩溃等),它应该这样写才严谨:
const char* str = "abc";
使用char*-base在现在是一个不提倡的做法,即便你经常能在旧的代码中看到它。
如今应该使用char[]-base字符串或string来替代它。
感兴趣的可以阅读这篇文章:从语句 char* p="test" 说起