首页 > 解决方案 > C++ 通过引用交换值

问题描述

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

帮助将不胜感激。

谢谢。

标签: c++pass-by-referencefunction-pointers

解决方案


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

您可以将这些变量重命名为xy不更改函数的行为。这也将提醒人们 inmain和 in 的名称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改用。在用户空间中定义一个复制标准库函数功能的函数没有任何好处。


推荐阅读