1

假设我在 C++ 中有这个:

char *p = "Apple";

我不能这样做:

p[1] = 'w';

但为什么我可以这样做?

p = "OrangeTorange";
4

3 回答 3

3

由于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 *strchar str[]是不同的。要理解它,请阅读:sizeof(&arr) 返回什么?

于 2013-08-15T17:39:00.037 回答
3

p[1] = 'w'正在尝试修改字符串文字,这是非法的。p = "OrangeTorange"只是将不同的字符串文字分配给p,这很好。

于 2013-08-15T17:39:01.463 回答
0

您不能修改原始字符串,因为它是只读数据。您可以修改指针以指向不同的字符串,因为指针是可修改的。也就是说,p = "OrangeTorange"不是修改原始字符串,只是改变指针指向p的位置。

于 2013-08-15T17:40:10.583 回答