【问题标题】:Pass by reference vs pass by pointer? [duplicate]通过引用传递与通过指针传递? [复制]
【发布时间】:2011-05-05 07:03:15
【问题描述】:

可能重复:
When to pass by reference and when to pass by pointer in C++?

引用传递和指针传递值有什么区别?

【问题讨论】:

  • 这个问题在 SO 上大约有十亿个重复项。请参阅右侧的相关列表。
  • 对不起,我应该在发布问题之前检查答案。我会要求版主删除这个。

标签: c++


【解决方案1】:

当您通过引用传递参数时,函数内部的参数是您从外部传递的变量的别名。当您通过指针传递变量时,您获取变量的地址并将地址传递给函数。主要区别在于您可以将没有地址的值(如数字)传递给采用 const 引用的函数,而不能将无地址的值传递给采用 const 指针的函数。

通常,C++ 编译器将引用实现为隐藏指针。

您可以通过这种方式将函数更改为指针变体:

void flip(int *i) // change the parameter to a pointer type
{
    cout << "          flip start "<<"i="<< *i<<"\n"; // replace i by *i
    *i = 2*(*i); // I'm not sure it the parenthesis is really needed here,
                 // but IMHO this is better readable
    cout << "          flip exit  "<<"i="<< *i<<"\n";
}

int main()
{
    int j =1;
    cout <<"main j="<<j<<endl;
    flip(&j); // take the address of j and pass this value
    // adjust all other references ...
}

【讨论】:

    【解决方案2】:

    对于你问题的第二部分,这里是代码。

    #include <iostream>
    #include <cassert>
    
    using namespace std;
    
    void flip(int *i)
    {
        cout << "          flip start "<<"i="<< i<<"\n";
        *i *= 2;
        cout << "          flip exit  "<<"i="<< i<<"\n";
    }
    
    int main()
    {
        int j =1;
        cout <<"main j="<<j<<endl;
        flip(&j);
        cout <<"main j="<<j<<endl;
        flip(&j);
        cout <<"main j="<<j<<endl;
        flip(&j);
        cout <<"main j="<<j<<endl;
    
        assert(j==8);
    
        return 0;
    }
    

    对于您问题的第一部分,我是 C++ 新手,但我发现在必须为函数返回多个输出时通过指针传递很有用。或者将 NULL 作为参数传递。

    【讨论】:

      【解决方案3】:

      从技术上讲,您只需在变量名称前加一个星号即可通过引用传递;)现在它将传递变量在内存中的地址。

      现在引用传递和值传递的区别很简单。这么想吧.. 想象一下你自己想给你的朋友一颗糖果。

      如果你按值传递.. 你:嘿,我给你点东西。。 朋友:那是什么? 你在这里 朋友:谢谢xD

      如果你通过引用传递.. 你:嘿,我给你点东西。。 朋友:那是什么? 你:它在饼干罐所在的桌子的右侧 朋友:谢谢xD

      如果你按值传递,你的朋友不知道糖果是从哪里来的。它可能来自商店、冰箱或任何地方。现在如果你通过引用,你的朋友不知道你会给他什么。

      把它和编程联系起来,糖果就是变量的值。指令“它在 cookie jar 所在的表格的右侧”是变量值所在的内存地址。你会在数据结构中使用它,所以是的:) 希望我能以任何方式帮助你 xD

      【讨论】:

      • 问题是关于按引用传递与按指针传递...而不是按值传递...
      • 很好的类比,但没有回答问题
      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2019-09-16
      • 2014-07-27
      • 2023-03-03
      相关资源
      最近更新 更多