将指向字符串常量(又名字符串文字)的指针定义为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
是在之前还是之后*
有很大的不同。