按引用传递 vs 按指针传递?

18

14
这个问题在 Stack Overflow 上大约有 10 的 15 次方个重复。请看右侧的“相关”列表。请注意,此翻译保留了原文的意思和语气,并尽可能使其更通俗易懂。 - Björn Pollex
2
对不起,我在发布问题之前应该先检查答案。我会请管理员删除这个问题。 - mikhailovich
3个回答

19

当你通过引用传递参数时,在函数内部,该参数是从外部传递的变量的别名。而当你通过指针传递变量时,你需要获取该变量的地址并将其传递到函数中。主要区别在于,你可以将值(例如数字)作为常量引用传递到函数中,而无需使用地址,但是你无法将没有地址的值作为常量指针传递到函数中。

通常,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

针对您问题的第二部分,这里是代码。

#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。


-1

技术上说,你只需要在变量名前面加上一个星号就可以通过引用传递了 ;) 然后它现在会传递你的内存中变量所在的地址。

现在,按照引用和值传递的区别来看。这样想。。。想象你自己试图给朋友一颗糖果。

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

如果你按引用传递... 你:嘿,我要给你点什么。。。 朋友:什么? 你:在桌子右边饼干罐子那里 朋友:谢谢 xD

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

与编程有关,糖果是变量的值。指令“在桌子右边饼干罐子那里”是你的变量值所在的内存地址。你将在数据结构中经常使用它,所以 :) 希望我以某种方式帮助了你 xD


3
问题是关于按引用传递和按指针传递的区别,而不是按值传递。 - forsvarir
3
不错的比喻,但并未回答问题。 - rlc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接