通过引用传递vs传递指针?

时间:2011-05-05 07:03:16

标签: c++

  

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

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

3 个答案:

答案 0 :(得分:17)

当您通过引用传递参数时,函数内的参数是您从外部传递的变量的别名。当您通过指针传递变量时,您将获取变量的地址并将地址传递给函数。主要区别在于您可以将没有地址(如数字)的值传递给一个带有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 ...
}

答案 1 :(得分:1)

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

#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作为参数传递。

答案 2 :(得分:-1)

从技术上讲,你只需要在变量名之前加一个星号来通过引用传递;)然后它会传递变量在你记忆中的地址。

现在通过引用传递和传递值的差异很简单。想到这一点......想象自己想给你的朋友送糖果。

如果你通过值... 你:嘿,我要给你点什么.. 朋友:这是什么? 你在这里 朋友:谢谢xD

如果你通过参考传递.. 你:嘿,我要给你点什么.. 朋友:这是什么? 你:它位于桌子右侧的饼干罐子里 朋友:谢谢xD

如果你超过价值,你的朋友不知道糖果来自哪里。它可能来自商店,冰箱或任何地方。现在,如果你通过参考,你的朋友不知道你要给他什么。

将它与编程相关联,糖果是变量的值。指令“它位于cookie罐的表格右侧”是变量值所在的存储器地址。你非常愿意在数据结构中使用它,所以是啊:)希望我以任何方式帮助你xD