当前位置:  开发笔记 > 编程语言 > 正文

字符串文字

如何解决《字符串文字》经验,为你挑选了2个好方法。

我对c ++中的字符串文字几乎没有疑问.

char *strPtr ="Hello" ;
char strArray[] ="Hello";

现在strPtr和strArray被认为是字符串文字.

根据我的理解,字符串文字存储在只读存储器中,因此我们无法修改它们的值.

我们做不到

strPtr[2] ='a';
and strArray[2]='a';

以上陈述都应该是非法的.编译器应该在两种情况下抛出错误.

编译器将字符串文字保留在只读内存中,因此如果我们尝试修改它们,编译器会抛出错误.

const数据也被认为是只读的.

是否同样处理字符串文字和const数据?我可以使用const_cast从字符串文字中删除常量可以更改其值吗?

字符串文字到底存储在哪里?(在程序的数据部分)



1> strager..:

现在strPtr和strArray被认为是字符串文字.

不,他们不是.字符串文字是您在代码中看到的内容.例如,"Hello". strPtr是一个指向文字的指针(现在在可执行文件中编译).请注意它应该是const char *; 您不能合法地删除const每个C标准并期望在使用它时定义的行为. strArray是一个包含文字副本的数组(在可执行文件中编译).

以上陈述都应该是非法的.编译器应该在两种情况下抛出错误.

不,它不应该.这两个陈述完全合法.由于情况,第一个是未定义的.但是,如果它们是指向const chars的指针,那将是一个错误.

据我所知,字符串文字的定义方式与其他文字和常量相同.但是,有区别:

// 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数据的位置无关紧要.



2> dirkgently..:
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是好的.

字符串文字到底存储在哪里?

实施定义.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有