我无法理解c ++字符串指针在函数传递中是如何工作的。
void print(string str){
str+=" and sisters.";
}
int main(){
string s ="hello brother";
print(s);
cout<<s<<endl;
}
输出:
hello brother
以及以下功能 -
void print(string &str){
str+=" and sisters.";
}
int main(){
string s ="hello brother";
print(s);
cout<<s<<endl;
}
输出 -
hello brother and sisters.
我无法理解指针在&#34; string&amp; str&#34;的情况下如何工作?和 &#34; string str&#34;因为我传递了相同的字符串对象。
答案 0 :(得分:0)
您的任何程序都没有指针。相反,在第二个程序中,函数参数是引用。
引用引用其他内容,在您的示例中,参数引用s
函数中的变量main
。
在第一个程序中,您通过值传递参数,这意味着它是复制,并且该函数仅修改其自己的字符串本地副本。
因此,在第一个程序中,您有两个不同的string
个对象,修改一个不会修改另一个。在第二个程序中,您只有一个string
个对象,没有复制,两个变量都引用同一个对象。
答案 1 :(得分:-1)
&符号&
不是指针,表示您将pass the variable by reference。
在第一个示例中,您传递的值实际上是一个副本。它在内存中有不同的地址,当函数终止时,它将被销毁。这就是为什么尽管在hello brother
中添加了and sisters.
,您仍然只看到print
作为输出。
如果你有:
void print(string str){
str+=" and sisters.";
cout << "print: " << str << '\n';
}
你会看到输出
print: hello brother and sisters.
但是,退出该功能后,这些更改将被销毁,这就是您获得main
中显示的输出的原因。
在第二个示例中,您将传递对main中字符串s
的存储位置的引用。它不是副本,main
将显示后续功能中所做的任何更改。这意味着退出函数后对s
中字符串print
所做的任何更改都将保留,这就是您看到完整字符串hello brother and sisters.
的原因。
答案 2 :(得分:-1)
C ++通常按值传递。也就是说,传递给函数的是表达式的值。例如:
int add(int i)
{
i = i + 1;
return i;
}
int j = 1;
cout << add(j);
我们应该期望这输出2.但是j
的值仍然是1.我们将j
(即1)的值传递给add
。同样,add(8)
将返回9,但不会以某种方式将代码中的文字8转换为9。
但是,C ++也支持通过引用传递。通过引用传递,我们传递对象的隐喻位置,而不是它的值。例如:
int add(int& i)
{
i = i + 1;
return i;
}
int j = 1;
cout << add(j)
在这里,我们通过了add
对j
的引用,而不是其值。操纵该引用的目标操纵j
。在这种情况下,add(8)
将是非法的,并将生成编译器错误。
请注意,两个变量的名称是否相同无关紧要。我给了他们不同的名字,以便更容易指明我指的是哪一个。
此外,这些都与指针无关。指针变量具有的值是其他对象的地址。它们也可以通过价值或参考传递。