C++ 在CPP中按指针传递字符串并获得意外输出

C++ 在CPP中按指针传递字符串并获得意外输出,c++,C++,我试过这段代码,我不明白为什么我得到的输出是HL而不是HL。 请有人解释一下 void t(string *s){ s[1]='l'; } int main(){ string s = "HL"; t(&s); cout<<s; } 您现在拥有的是通过将一个不存在的字符串设置为“l”来更新它。这是未定义的行为 失败的原因是,当指针实际上指向单个字符串时,您正在索引指针,就像它指向字符串数组一样。您要做的是为实际字符串编制索引以获取其字符。必须

我试过这段代码,我不明白为什么我得到的输出是HL而不是HL。 请有人解释一下

void t(string *s){
    s[1]='l';
}
int main(){
    string s = "HL";
    t(&s);
    cout<<s;
}

您现在拥有的是通过将一个不存在的字符串设置为“l”来更新它。这是未定义的行为

失败的原因是,当指针实际上指向单个字符串时,您正在索引指针,就像它指向字符串数组一样。您要做的是为实际字符串编制索引以获取其字符。必须首先取消对指针的引用,如下所示:

void t(string *s){
    (*s)[1]='l';
}
int main(){
    string s = "HL";
    t(&s);
    cout<<s;
}
如果您实际使用的是引用,就像您的标题所建议的那样,您不需要在语法方面做任何特殊的操作:

void t(string& s){
    s[1]='l';
}
int main(){
    string s = "HL";
    t(s);
    cout<<s;
}

在函数t中,s是字符串*,因此s[1]等价于*s+1。在ITW中,它被视为指向字符串数组开头的指针,索引为1的元素被设置为l。将代码更改为*s[1]=“l”;做你想做的。

标题说通过引用传递,代码通过指针传递。请更新您的标题。您应该通过引用传递字符串,void tstring&s,然后调用ts修改字符串。下面的答案完全正确,可以告诉您发生了什么。您希望s[1]取消引用两次,一次是从指向字符串的指针,第二次是从字符串到其第二个元素。您需要s[0][1]或*s[1]之类的。