指向字符串的指针无法更改字符

-4 c++ arrays string pointers char

为什么我能够更改指针中的元素p,而不是指针r?我猜它必须使用指针的属性.

改变p[2]wGowdbye.更改r崩溃了代码.

p的地址是0x69fee0.

r的地址是0x69fedc.

两者在for循环中都有相同的输出(除了'Goodbye'一词结束后的垃圾数据).

int main()
{
    char q[]="Goodbye";
    char* p = q;
    char* r = "Goodbye";

    cout<<"Address of p: "<<&p<<endl;
    cout<<"Address of r: "<<&r<<endl;
    for(int i = 0; i<10; i++)
    {
        cout<<"P["<<i<<"]: "<<p[i]<<endl;
        cout<<"R["<<i<<"]: "<<r[i]<<endl;
    }
    p[2]='w';
    cout<<p<<endl;
    r[2]='w';
    cout<<r<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ner 8

区别在于它q是一个(可变)数组,它用字符串文字的"副本"初始化"Goodbye",而是r一个指向(不可变)字符串文字本身的指针.更改字符串文字是未定义的行为(因此可能会崩溃或执行其他操作).