[C++进阶]容易被忽视的细节之-基础篇

1,667次阅读
没有评论

字符串

历史遗留问题—— char*-based字符串

这是一个常见(应该说在旧的代码中常见)的字符串赋值语句:

char* str = "abc";

可以看到,这里使用了一个指针指向了一个字符串字面常量(String Literal)。对于不知道它的人来说,可能会有修改它的欲望,但实际上修改它会出现不可预料的后果(不同编译器可能会有不同处理方式),因为我们在尝试修改一个常量!
可是,它不应该是一个变量吗?实际上,我们仔细一看,虽然赋值符号左边是变量,但右边是一个字符串字面常量,把一个字符串字面常量赋给一个指针,想必编译器一定要做一些“小动作”才能实现。
实际上,str指向的是一个常量,这个常量的类型是const char[],所以修改它会出现严重的错误(程序崩溃等),它应该这样写才严谨:

const char* str = "abc";

使用char*-base在现在是一个不提倡的做法,即便你经常能在旧的代码中看到它。
如今应该使用char[]-base字符串或string来替代它。

感兴趣的可以阅读这篇文章:从语句 char* p="test" 说起

Lyzen
版权声明:本站原创文章,由 Lyzen 2022-08-16发表,共计1893字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码