=0;i--){ rev+=str[i]; } 返回&修订; } int main(){ std::string s=“”; std::cout,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference" /> =0;i--){ rev+=str[i]; } 返回&修订; } int main(){ std::string s=“”; std::cout,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference" />

C+中的指针和引用+; 我对C++是相当新的,因此试图准确地理解指针和引用的工作方式。因此,我有一个简单的程序,它应该引用一个字符串并返回对另一个字符串的引用。 我也不想复制。 这是密码 #include <iostream> #include <cstdlib> #include <string> std::string& string_reverse(std::string& str){ std::string rev = ""; for(int i= str.length() -1; i >=0; i--){ rev+=str[i]; } return &rev; } int main(){ std::string s=""; std::cout<<"Please enter a string..."<<std::endl; std::cin>>s; std::cout<< string_reverse(s)<<std::endl; } #包括 #包括 #包括 std::string和string_反转(std::string和str){ std::string rev=“”; 对于(int i=str.length()-1;i>=0;i--){ rev+=str[i]; } 返回&修订; } int main(){ std::string s=“”; std::cout

C+中的指针和引用+; 我对C++是相当新的,因此试图准确地理解指针和引用的工作方式。因此,我有一个简单的程序,它应该引用一个字符串并返回对另一个字符串的引用。 我也不想复制。 这是密码 #include <iostream> #include <cstdlib> #include <string> std::string& string_reverse(std::string& str){ std::string rev = ""; for(int i= str.length() -1; i >=0; i--){ rev+=str[i]; } return &rev; } int main(){ std::string s=""; std::cout<<"Please enter a string..."<<std::endl; std::cin>>s; std::cout<< string_reverse(s)<<std::endl; } #包括 #包括 #包括 std::string和string_反转(std::string和str){ std::string rev=“”; 对于(int i=str.length()-1;i>=0;i--){ rev+=str[i]; } 返回&修订; } int main(){ std::string s=“”; std::cout,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference,首先,不返回作用域局部变量的引用 std::string& string_reverse(std::string& str){ // ^ 换成 std::string string_reverse(std::string& str){ 此处无法返回引用,因为函数返回后,rev变量将被销毁(另请参阅) 其次,不要使用和创建引用: return &rev; // ^ 这将采用rev(即指针)的地址。您只需编写(对于任何一种情况) 最后

首先,不返回作用域局部变量的引用

std::string& string_reverse(std::string& str){
        // ^
换成

std::string string_reverse(std::string& str){
此处无法返回引用,因为函数返回后,
rev
变量将被销毁(另请参阅)

其次,不要使用
创建引用:

 return &rev;
     // ^
这将采用
rev
(即指针)的地址。您只需编写(对于任何一种情况)

最后但并非最不重要的一点是,您不需要为输入参数传递非
const
引用

std::string string_reverse(const std::string& str){ 
                        // ^^^^^

如果函数没有更改,这将修复您的错误

#include <iostream>
#include <cstdlib>
#include <string>

std::string string_reverse(std::string& str){   // made change here
  std::string rev = "";
  for(int i= str.length() -1; i >=0; i--){
    rev+=str[i];
  }
  return rev;        // made change here

}

int main(){
  std::string s="";
  std::cout<<"Please enter a string..."<<std::endl;
  std::cin>>s;
  std::cout<< string_reverse(s)<<std::endl;

}
#包括
#包括
#包括
std::string_reverse(std::string&str){//在此处进行了更改
std::string rev=“”;
对于(int i=str.length()-1;i>=0;i--){
rev+=str[i];
}
return rev;//在此处进行了更改
}
int main(){
std::string s=“”;

std::cout你把引用和地址混在一起,把两者都去掉,它就会起作用:

std::string string_reverse(std::string& str){
    std::string rev = "";
    for(int i= str.length() -1; i >=0; i--){
        rev+=str[i];
    }
    return rev;

}

实际错误是您返回了对将在范围外销毁的内容的引用。

“返回对另一个字符串的引用”-它是函数的本地函数,在您可以对其执行任何操作之前被销毁。可以按值返回,也可以反转传递的字符串,然后不返回任何内容,或者返回对该字符串的引用。函数声明为返回引用,但您尝试返回指针,运算符
&
的地址将生成指针。但是在你解决了这个简单的问题之后,还有比这更糟糕的问题,也就是说,你返回了一个对局部变量的引用,这个变量一旦函数退出,就会超出范围,剩下一个悬空引用,使用它会导致错误。一般来说,当你问问题l时,你应该在你的问题中包含错误就像这样。你不仅让读者更容易阅读,而且让他们有机会教你如何阅读错误,这样你就可以自己解决问题了!还有更多的错误,OP的代码不返回引用,而是返回指针。好吧,我已经编译了代码,但是还有其他方法吗?我正在尝试理解路过更好的引用。
rev
是在本地范围内的堆栈上创建的,因此您不希望将对它的引用从
string\u reverse
(其范围)中传递出去!任何一个好的编译器实际上都不会进行任何复制,但会构造它将要结束的底层
字符串
对象。难道你的链接没有比link1、link2等更好的标题吗?实际上,尝试遵循这些标题看起来并不太好。
std::string string_reverse(std::string& str){
    std::string rev = "";
    for(int i= str.length() -1; i >=0; i--){
        rev+=str[i];
    }
    return rev;

}