我最近一直在学习C++,并意识到C++中的字符串必须是常量,而在C中则不是.这里有一个例子.以下代码在C中有效,但在C++中无效:
char* str = "Hello World";
为了在C++中执行相同的操作,必须使用以下语句:
const char* str = "Hello World";
有人能解释一下为什么吗?
我最近一直在学习C++,并意识到C++中的字符串必须是常量,而在C中则不是.这里有一个例子.以下代码在C中有效,但在C++中无效:
char* str = "Hello World";
为了在C++中执行相同的操作,必须使用以下语句:
const char* str = "Hello World";
有人能解释一下为什么吗?
在Christian Gibbons的回答上再进一步...
在C语言中,像"Hello W或ld"
这样的字符串存储在char
的数组中,这样它们在程序的整个生命周期内都是可见的.字符串文字supposed是不可变的,一些实现将它们存储在只读内存段中(这样,试图修改文字的内容将触发运行时错误).有些实现不会,并且try 修改文本的内容可能不会触发运行时错误(甚至可能看起来像预期的那样工作).C语言定义将行为保留为"未定义",以便编译器可以随意处理它认为合适的情况.
在C++中,字符串文字存储在const char
的数组中,因此任何修改文字内容的try 都会触发诊断at compile time.
正如克里斯蒂安指出的,const
个关键词原本不是C.的一部分,但是它最初是C++的一部分,它使得使用字符串文字更加安全.
记住,const
关键字does not的意思是"将这个存储在只读存储器中",它只表示"这个东西可能不是赋值的目标".
还要记住,除非它是sizeof
或一元*
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则"T
的N元素数组"类型的expression将被转换("Decay")为"指向T
的指针"类型的表达式,并且表达式的值将是数组的第一个元素的地址.
在C++中,当您编写
const char *str = "Hello, w或ld";
字符串的第一个字符的address存储为str
.您可以将str
设置为指向different字符串文字:
str = "Goodbye cruel w或ld";
但是您cannot要做的是修改字符串的内容,如下所示
str[0] = 'h';
或
strcpy( str, "Something else" );