假设我在 C++ 中有这个:
char *p = "Apple";
我不能这样做:
p[1] = 'w';
但为什么我可以这样做?
p = "OrangeTorange";
由于p
指向常量字符串文字,因此如果您这样做:p[1] = 'w';
那么您正在尝试修改只读常量的字符串文字及其非法操作(未定义行为)。
而在表达式中p = "OrangeTorange";
,您修改指向 char的p
变量的值。并且分配新的地址值p
是一个有效的操作,现在p
开始指向新的字符串文字。
进一步补充,假设如果p
指向一个数组则 p[1] = 'w';
不是无效操作,请考虑以下示例代码:
char str[] = "Apple";
char* p = str; // p points to a array
p[1] = 'w'; // valid expression, not str[1] = 'w' is well valid.
p = "OrangeTorange"; // is valid
// str = "OrangeTorange"; is NOT valid as `str` is not a pointer but array name
这里要求的两个操作都是有效的!
注意:两个声明char *str
和char str[]
是不同的。要理解它,请阅读:sizeof(&arr) 返回什么?
p[1] = 'w'
正在尝试修改字符串文字,这是非法的。p = "OrangeTorange"
只是将不同的字符串文字分配给p
,这很好。
您不能修改原始字符串,因为它是只读数据。您可以修改指针以指向不同的字符串,因为指针是可修改的。也就是说,p = "OrangeTorange"
不是修改原始字符串,只是改变指针指向p
的位置。