字符串(常量)字面量指针

String (constants) Literals pointer

我是 C++ 的新手,我搜索了我的问题的答案,但我变得更加困惑。据我了解,字符串文字必须由 "const" 指针指向,因为它们被认为是只可读的。我也理解指针本身不是常量(并且可以更改),但实际上它指向一个字符串 constant.I 也理解字符串本身不能被修改。所以在这个例子中:

const char* cstr="string";
*cstr = 'a';

我收到一个错误:"assignment of read-only location." 现在,如果我如下定义我的 C 字符串,并定义一个指向它的指针,我将能够更改字符串:

char str[7]="string";
char* cstr = str;
*cstr = 'a';
cout << cstr <<endl;

字符串将被修改(output --> a),表示字符串的第一个元素被修改。我的两个问题是: 1- 为什么在第二个示例中我可以修改 C 字符串,但在第一个示例中我不能对字符串进行任何更改? 2- 在这两种情况下我都使用指针,但在第一种情况下我应该使用常量字符指针?

当你使用语法时

const char* cstr="string";

C++ 定义:

  • 内存只读区的7个字符数组,其中内容string[=12=]
  • 堆栈上的指针(或内存的可写全局部分),以及该数组的地址。

但是,当您使用语法时:

char str[7]="string";

C++ 定义:

  • 堆栈上(或内存的可写全局部分)的 7 个字符的数组,其中包含内容 "string[=42=]"。

在第一种情况下,实际值在只读内存中,因此您无法更改它们。在第二种情况下,它们在可写内存中(堆栈或全局)。

C++ 试图强制执行此语义,因此如果定义为只读内存,则应使用 const 指针。

请注意,并非所有体系结构都具有只读内存,但因为它们中的大多数都有,并且 C++ 可能希望使用只读内存功能(为了更好的正确性) , 那么 C++ 程序员应该假设(为了指针类型的目的)常量将被放置在只读内存中。