假设我在C ++中有这个:
char *p = "Apple";
我不能这样做:
p[1] = 'w';
但我为什么要这样做?
p = "OrangeTorange";
答案 0 :(得分:3)
因为p
指向常量字符串文字,所以如果你这样做:p[1] = 'w';
那么你试图修改只读常量的字符串文字及其非法操作(未定义)行为)。
而在表达式p = "OrangeTorange";
中,您修改了p
变量的值,该值是指向char的指针。将新地址值分配给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[]
不同。要理解它,请阅读:What does sizeof(&arr) return?
答案 1 :(得分:3)
p[1] = 'w'
正在尝试修改字符串文字,这是非法的。 p = "OrangeTorange"
只是为p
指定了不同的字符串文字,这很好。
答案 2 :(得分:0)
您无法修改原始字符串,因为它是只读数据。您可以将指针修改为指向不同的字符串,因为指针是可修改的。也就是说,p = "OrangeTorange"
不会修改原始字符串,只会更改指针p
指向的位置。