const char * and char *

6

I understand that

char *s = "Hello World!" ; 

这个字符串被存储在只读内存中,通过指针无法修改字面值。

这与以下内容有何不同:

const char *s = "Hello World!"; 

此外,'string' 的类型是char *还是const char *?

第一种方式已经被弃用并且存在危险。 - Beta
2个回答

8
区别在于后者是合法的,前者不是。这是在C++11中进行的更改。形式上,"Hello World!"的类型为const char[13];它可以被转换为const char*。在旧版本中,它的类型可以是char[13],可以转换为char*。C++通过添加const来改变数组的类型,但保留了转换为char*的方式,以便现有使用char*的C代码可以在C++中工作,但修改指针所指向的文本会导致未定义行为。C++11删除了对char*的转换,因此现在您只能使用以下合法方式:
const char *s = "Hello world!";

C++11移除了转换为char*的功能,但在gcc48中仍然存在。这是gcc的bug吗? - Leonid Volnitsky
@LeonidVolnitsky - 在C++11中不允许进行转换。规则是编译器必须针对不说“不需要诊断”的约束条件的违规发出诊断。因此,所需的只是一种诊断方法,有时是警告。 - Pete Becker
如果添加const会改变类型,那么const<char*>const<char[]>更合理吧? - András Hummer

6

将类型设置为const char *,可以更难意外覆盖内存,因为如果尝试覆盖,则编译器会报错:

const char *s = "Hello World!";
s[0] = 'X';  // compile error

如果您不使用const,那么问题可能直到运行时才被捕获,或者只会使您的程序微妙地出现错误。

哦,我明白了。尝试修改char *s可以成功编译,但是const char *s不行。所以基本上放置const就像是一个红旗,告诉你不要改变字符串。太棒了! - dharag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接