因为它们都指向无法修改的字符。在第一个中使用const有什么好处?是否只是告诉编译器要注意可能执行ptr[1] = 'a'
char const *ptr = "some characters"
char *ptr = "some characters"
答案 0 :(得分:4)
是的,因此当您尝试通过指针修改内容时,您将在运行时收到编译器错误而不是令人讨厌的意外。
答案 1 :(得分:3)
在C ++中,const char[N]
(字符串文字的实际类型)到char *
的转换已弃用,不再适用于C ++ 11(C ++ 11,C ++03§4.2)。所以,#2新破了。 C ++ 98 / C ++ 03编译器通常会产生警告; C ++ 0x / C ++ 11编译器应该完全拒绝。
const
的要点是编译器可以告诉您何时尝试删除或违反它。即使您不打算尝试修改这些字符,优点是如果您不小心会发生错误。
你可以随时使用const_cast
来处理它,虽然在这种情况下,内存很可能是只读的,无论是物理的还是通过MMU,都无法解决任何问题。
答案 2 :(得分:2)
使用const
很少“必要”,从纯粹的“执行此代码会产生预期结果”的观点来看。
然而,大量使用const
对于阅读代码并试图理解它的人来说是一个巨大的帮助。这很值得。我建议始终将const
放在任何可行的地方。
以类似的方式,出于几乎相同的原因,总是将函数声明为严格本地的static
。
答案 3 :(得分:1)
建议这样做:
char const *ptr = "some characters";
以下是不建议,因为您可能会尝试将 const 数据ptr
点更改为。
char *ptr = "some characters";
好的编制者应该在第二种情况下发出警告。
海湾合作委员会(4.3.4)确实发出警告:
prog.cpp:7:警告:不推荐将字符串常量转换为'char *'
答案 4 :(得分:0)
告诉编译器要注意可能尝试更改字符串的任何代码。 虽然,你可以聪明并仍然改变字符串,但通常是为了防止代码中的意外错误。
答案 5 :(得分:0)
在C
中,以下两个定义都是完全合法且合理的。
char const *ptr1 = "some characters";
char *ptr2 = "some characters";
在C
中,字符串文字是类型char[]
的值。在大多数情况下,它会衰减为char*
类型的值。对许多人来说,添加const
修饰符是一个很好的习惯:如果代码尝试更改字符串文字(这是未定义的行为),它会让编译器抱怨。