【问题标题】:C++ strings passing in function with pointer用指针传入函数的 C++ 字符串
【发布时间】:2016-10-12 19:10:10
【问题描述】:

我不明白 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.

我无法理解指针在 "string &str" 和 "string str" 因为我传递的是同一个字符串对象。

【问题讨论】:

标签: c++ string pointers


【解决方案1】:

& 符号&amp; 不是指针,表示你将pass the variable by reference

在您的第一个示例中,您通过值传递,这本质上是一个副本。它在内存中有不同的地址,当函数终止时,它会被销毁。这就是为什么尽管在print 中添加了and sisters.,但您只看到hello brother 作为输出。

如果你有:

void print(string str){
    str+=" and sisters.";
    cout << "print: " << str << '\n';
}

你会看到输出

print: hello brother and sisters.

但是,一旦您退出函数,这些更改就会被破坏,这就是您在 main 中看到的输出的原因。

在第二个示例中,您传递了对 main 中字符串 s 的存储位置的引用。它不是副本,后续功能中所做的任何更改都将通过main 可见。这意味着一旦您退出函数,对 print 中的字符串 s 所做的任何更改都将持续存在,这就是您看到完整字符串 hello brother and sisters. 的原因。

【讨论】:

    【解决方案2】:

    您的任何程序中都没有指针。相反,在第二个程序中,函数参数是一个引用

    引用引用了其他内容,在您的示例中,参数引用了 main 函数中的变量 s

    在第一个程序中,您传递参数按值,这意味着它是复制的,并且该函数只修改它自己的字符串本地副本。

    所以在第一个程序中你有两个不同的string 对象,修改一个不会修改另一个。在第二个程序中,您只有一个 string 对象,没有复制,两个变量都引用同一个对象。

    【讨论】:

      【解决方案3】:

      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) 将是非法的,并且会产生编译器错误。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2015-06-03
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多