关于string指针的有关问题,希望帮忙解释下,多谢
关于string指针的问题,希望帮忙解释下,谢谢!
1:vector <string *> ps;
2:string s;
3:string s12 = "hels";
4:while(getline(cin ,s))
{
5: string * s1 = new string;
6: *s1 = s;
7: ps.push_back(s1);
}
8:ps.push_back(&s12);
为什么已经初始化的sting字符串可以直接取地址赋值给指向string的指针,而通过程序运行初始化的sting字符串是像第6句那样初始化?而不能像第8句那么初始化?
------解决方案--------------------
s1= &s 也可以啊,只是意义不同:
*s1=s是把s的内容拷贝给s1所指的string
而s1=&s是让s1这个指针去指向s
------解决方案--------------------
同理,ps.push_back(& s)这么写在语法上是没有问题的,它的问题在于:
如果你每次循环都用ps.push_back(& s),那么它每次都只是把s的地址放进vector里,而s的地址是不会变的,最终导致vector里所有的元素都是相同的——都是s的地址,而这显然不是你想要的结果
而string * s1 = new string;
*s1 = s;
ps.push_back(s1);
这个写法,每次循环都new出一个新的string来,把当前s的内容拷贝给这个新的string,再把新string的地址放进vector里,所以循环多少次就有多少个string,这才是你想要的
------解决方案--------------------
都改成动态分配的吧
或者
------解决方案--------------------
1:vector <string *> ps;
2:string s;
3:string s12 = "hels";
4:while(getline(cin ,s))
{
5: string * s1 = new string;
6: *s1 = s;
7: ps.push_back(s1);
}
8:ps.push_back(&s12);
为什么已经初始化的sting字符串可以直接取地址赋值给指向string的指针,而通过程序运行初始化的sting字符串是像第6句那样初始化?而不能像第8句那么初始化?
String
指针
------解决方案--------------------
s1= &s 也可以啊,只是意义不同:
*s1=s是把s的内容拷贝给s1所指的string
而s1=&s是让s1这个指针去指向s
------解决方案--------------------
同理,ps.push_back(& s)这么写在语法上是没有问题的,它的问题在于:
如果你每次循环都用ps.push_back(& s),那么它每次都只是把s的地址放进vector里,而s的地址是不会变的,最终导致vector里所有的元素都是相同的——都是s的地址,而这显然不是你想要的结果
而string * s1 = new string;
*s1 = s;
ps.push_back(s1);
这个写法,每次循环都new出一个新的string来,把当前s的内容拷贝给这个新的string,再把新string的地址放进vector里,所以循环多少次就有多少个string,这才是你想要的
------解决方案--------------------
都改成动态分配的吧
vector <string *> ps;
string s;
string s12 = "hels";
while(getline(cin ,s))
{
ps.push_back(new string(s));//copy
}
ps.push_back(new string(s12));//copy
//...
记得释放哦
或者
vector <string> ps;
string s;
string s12 = "hels";
while(getline(cin ,s))
{
ps.push_back(s);//copy
}
ps.push_back(s12);//copy
//不用担心释放了
------解决方案--------------------