我在考试中遇到了一个 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
中的变量p
和p
是函数的局部变量。对这些变量所做的任何更改都在函数本地进行。它们不会更改调用函数中的任何内容。
您可以将这些变量重命名为 x
和 y
而无需更改函数的行为。这也将提醒您,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/