[英]Pointers and references in 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_reverse(std::string& str){
// ^
更改为
std::string string_reverse(std::string& str){
这里不能返回引用,因为rev
变量将在函数返回后被销毁(另请参见局部变量的内存可以在其作用域之外访问吗? )。
其次,您不使用&
来创建参考:
return &rev;
// ^
那将使用rev
的地址(即指针)。 您只需编写(无论哪种情况)
return rev;
最后但并非最不重要的一点是,您不需要为输入参数传递非const
引用。 最好写
std::string string_reverse(const std::string& str){
// ^^^^^
如果函数没有改变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;
}
正如其他人所建议的那样,您的代码存在的问题是,在函数返回后变量rev
将被破坏(它超出范围),并且您的代码导致未定义的行为。
这是您可能需要阅读的一些链接(这些链接可以为您提供比我更多的信息,但是您必须耐心阅读所有内容)。
http://www.cs.fsu.edu/~myers/c++/notes/references.html
http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/
http://www.tutorialspoint.com/cplusplus/cpp_function_call_by_reference.htm
您正在混合引用和地址,将两者都摆脱掉,它将起作用:
std::string string_reverse(std::string& str){
std::string rev = "";
for(int i= str.length() -1; i >=0; i--){
rev+=str[i];
}
return rev;
}
实际的错误是您返回对将销毁范围的东西的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.