我对c ++中的字符串文字几乎没有疑问.
char *strPtr ="Hello" ; char strArray[] ="Hello";
现在strPtr和strArray被认为是字符串文字.
根据我的理解,字符串文字存储在只读存储器中,因此我们无法修改它们的值.
我们做不到
strPtr[2] ='a'; and strArray[2]='a';
以上陈述都应该是非法的.编译器应该在两种情况下抛出错误.
编译器将字符串文字保留在只读内存中,因此如果我们尝试修改它们,编译器会抛出错误.
const数据也被认为是只读的.
是否同样处理字符串文字和const数据?我可以使用const_cast从字符串文字中删除常量可以更改其值吗?
字符串文字到底存储在哪里?(在程序的数据部分)
现在strPtr和strArray被认为是字符串文字.
不,他们不是.字符串文字是您在代码中看到的内容.例如,"Hello"
. strPtr
是一个指向文字的指针(现在在可执行文件中编译).请注意它应该是const char *
; 您不能合法地删除const
每个C标准并期望在使用它时定义的行为. strArray
是一个包含文字副本的数组(在可执行文件中编译).
以上陈述都应该是非法的.编译器应该在两种情况下抛出错误.
不,它不应该.这两个陈述完全合法.由于情况,第一个是未定义的.但是,如果它们是指向const char
s的指针,那将是一个错误.
据我所知,字符串文字的定义方式与其他文字和常量相同.但是,有区别:
// These copy from ROM to RAM at run-time: char myString[] = "hello"; const int myInt = 42; float myFloats[] = { 3.1, 4.1, 5.9 }; // These copy a pointer to some data in ROM at run-time: const char *myString2 = "hello"; const float *myFloats2 = { 3.1, 4.1, 5.9 }; char *myString3 = "hello"; // Legal, but... myString3[0] = 'j'; // Undefined behavior! (Most likely segfaults.)
我在这里使用ROM和RAM是一般的.如果平台只是RAM(例如大多数Nintendo DS程序),那么const数据可能在RAM中.但是,写作仍未定义.对于普通的C++程序员来说,const数据的位置无关紧要.
char *strPtr ="Hello" ;
定义strPtr
指向字符串文字的char的指针"Hello"
- 该指针的有效类型是const char *
.不允许修改strPtr
指针(如果你尝试这样做,则调用UB).这是旧C代码的向后兼容功能.在C++ 0x中不推荐使用此约定.见附件C:
更改:字符串文字制作const字符串文字 的类型从"char of char"更改为"const char数组".[...]
基本原理:这可以避免调用不适当的重载函数,该函数可能希望能够修改其参数.
对原始特征的影响:改变定义明确的特征的语义.转换难度:简单的句法转换,因为字符串文字可以转换为char*; (4.2).最常见的情况由新的但已弃用的标准转换处理:
char* p = "abc"; // valid in C, deprecated in C++
char* q = expr ? "abc" : "de"; // valid in C, invalid in C++
使用的广泛程度:有合理理由将字符串文字视为可能可修改内存的指针的程序可能很少见.
char strArray[] ="Hello";
声明的类型strPtr
是 - 它是一个未指定大小的字符数组,包含包含Hello
空终止符的字符串,即6个字符.但是,初始化使它成为一个完整的类型,它的类型是6个字符的数组.修改通过strPtr
是好的.
字符串文字到底存储在哪里?
实施定义.