C++ 通过引用交换值

标签 c++ pass-by-reference function-pointers

我在考试中遇到了一个 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 函数时,为什么不在其中交换值。

我们将不胜感激。

谢谢。

最佳答案

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。在用户空间中定义一个复制标准库函数功能的函数没有任何好处。

关于C++ 通过引用交换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379759/

相关文章:

c++ - 函数调用参数中的构造函数样式转换

c++ - QT无法打开输出文件debug\trud1.exe : Permission denied

python - 如何将另一个列表分配给列表 "passed by reference"?

Java 通过引用转码到 Python

c++ - 使用 std::function 对象指向 C++11 中较大容器中结构的单个组件的迭代器

c++ - QObject::connect 中 Func2 类型的参数?

c++ - shell 扩展 : DragQueryFile returns at most 16 (in Windows 7)

c++ - 使用 'auto' 删除许多 vector 元素

c++ - 通过引用传递的指针? (完整性检查)

c++ - [[noreturn]] 函数指针