将指向字符串常量(又名字符串文字)的指针定义为const char *允许编译器检测不正确的访问,如果您尝试在代码中的其他位置修改pt1指向的内容,*pt1 = 'A';而如果pt1有 type ,则在运行时只会有未定义的行为char *,导致在某些架构上崩溃,对其他架构的影响不太明显但可能更具破坏性。
为了扩展这个主题,有时const对于指针定义的含义会产生混淆:
const char *pt1 = "Hello";定义一个可修改的指针pt1,指向一个char不能通过它修改的数组。由于"Hello"是一个字符串常量,它是正确的类型pt1。pt1可以修改为指向另一个字符串或char,可修改或不可修改,或设置为NULL。
char *pt2 = "Hello";定义一个可修改的指针pt2,指向一个char可以通过它修改的数组。尽管"Hello"与历史代码兼容,C 标准仍然允许这样做。gcc和clang-Wwrite-strings可以使用命令行选项禁用此行为。我强烈建议使用此警告和更多警告以避免常见错误。
const char * const pt3 = "Hello";定义一个常量指针pt3,指向一个char不能通过它修改的数组。pt3不能修改为指向另一个字符串,甚至不能设置为NULL.
char * const pt4 = "Hello";定义一个常量指针pt4,指向一个char可以通过它修改的数组。pt4初始化后无法更改。
char并且const可以按任何顺序放置,但是const是在之前还是之后*有很大的不同。