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
中名为 p
和 q
的新变量中。然后交换新变量。返回值 &p
并存储在 main
的变量 t
.
中
此外,一些内存泄漏,因为 int
是用 new
创建的,并且从未用 delete
销毁。
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
。在用户 space 中定义一个复制标准库函数功能的函数没有任何好处。
我在考试中遇到了一个 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
中名为 p
和 q
的新变量中。然后交换新变量。返回值 &p
并存储在 main
的变量 t
.
此外,一些内存泄漏,因为 int
是用 new
创建的,并且从未用 delete
销毁。
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
。在用户 space 中定义一个复制标准库函数功能的函数没有任何好处。