C++ 通过引用交换值

C++ Swapping Values By Reference

我在考试中遇到了一个 C++ 代码片段,这让我很困惑(至少对我而言)。我试图分析它,但有些东西我无法理解。代码写在下面:

#include <iostream>

using namespace std;

int* doMagic(int *p, int *q)
{
    int* t = new int();
    t = p;
    p = q;
    q = t;
    return t;
}

int main()
{
    int p = 5, q = 10;
    int *t = NULL;
    t = doMagic(&p, &q);
    cout<<"p = "<<p<<endl;
    cout<<"q = "<<q<<endl;
    cout<<"t = "<<*t<<endl;
    return 0;
}

输出为:

p = 5
q = 10
t = 5

现在我的问题是,当值通过引用传递给 doMagic 函数时,为什么不在其中交换值。

非常感谢您的帮助。

谢谢。

在此代码中,没有任何内容通过引用传递。

一些指针值(&p&q)按值传递。

因为它们是按值传递的,所以它们被存储到 doMagic 中名为 pq 的新变量中。然后交换新变量。返回值 &p 并存储在 main 的变量 t.

此外,一些内存泄漏,因为 int 是用 new 创建的,并且从未用 delete 销毁。

doMagic 中的变量 pp 是函数的局部变量。对这些变量所做的任何更改都在函数本地进行。它们不会更改调用函数中的任何内容。

您可以将这些变量重命名为 xy,而无需更改函数的行为。这也将提醒人们 main 中的名称和 doMagic 中的名称是分开且独立的。

您可以通过交换指针指向的对象的值来交换 doMagic 中的值:

void doMagic(int *p, int *q)
{
    int t = *p;
    *p = *q;
    *q = t;
}

尽管 C++ 惯用地使用引用更好

void doMagic(int& p, int& q)
{
    int t = p;
    p = q;
    q = t;
}

然后,函数可以从 main 调用为:

doMagic(p, q);

话虽如此,如果您不打算在函数中做更多的事情,您应该改用 std::swap。在用户 space 中定义一个复制标准库函数功能的函数没有任何好处。