用指针传递函数的C ++字符串

时间:2016-06-12 06:56:39

标签: c++ string pointers

我无法理解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;因为我传递了相同的字符串对象。

3 个答案:

答案 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)

在这里,我们通过了addj的引用,而不是其值。操纵该引用的目标操纵j。在这种情况下,add(8)将是非法的,并将生成编译器错误。

请注意,两个变量的名称是否相同无关紧要。我给了他们不同的名字,以便更容易指明我指的是哪一个。

此外,这些都与指针无关。指针变量具有的值是其他对象的地址。它们也可以通过价值或参考传递。