字符串(常量)字面量指针
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++ 程序员应该假设(为了指针类型的目的)常量将被放置在只读内存中。
我是 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++ 程序员应该假设(为了指针类型的目的)常量将被放置在只读内存中。