2013-03-29 84 views
6

我明白const char *与字符*

char *s = "Hello World!" ; 

被存储在只读存储器和所述字符串文字不能经由指针进行修改。

这是如何从

const char *s = "Hello World!"; 

不同的也就是 '串' 的char *或为const char *的类型?

+0

第一种方式已经过时和危险的。 – Beta

回答

6

通过给类型const char *,这样不容易意外覆盖的内存,因为如果你尝试编译器会给出错误:

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

如果你不使用const,那么问题直到运行时才能被捕获,否则可能会导致程序出错。

+0

哦,是的,我看到试图修改char * s,编译成功,但const char * s,不。所以基本上把const作为一个红旗来改变字符串。酷! – dharag

8

区别在于后者是合法的,前者不是。这是在C++ 11中做出的改变。形式上,"Hello World!"的类型为const char[13];它可以转换为const char*。在过去的日子里,它的类型可以是char[13],它可以转换为char*。通过添加const,C++改变了数组的类型,但保持转换为char*,以便使用char*的现有C代码可以在C++中工作,但修改指针指向的文本会产生未定义的行为。 C++ 11取出转化为char*,所以现在你只能做法律

const char *s = "Hello world!"; 
+0

'C++ 11删除了转换为char *' - 不在gcc48中。这是gcc的错误? –

+0

@LeonidVolnitsky - 在C++ 11中不允许转换。规则是,编译器必须针对违反约束条件的问题发出诊断,该约束条件不会说“不需要诊断”。所以只需要一个诊断,这有时是一个警告。 –

+0

如果增加'const'改变类型,不会'const '或'const '更合乎逻辑吗? –