c++ - 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
函数时,为什么没有在其中交换值。
帮助将不胜感激。
谢谢。
解决方案
变量p
和p
indoMagic
是函数的局部变量。对这些变量所做的任何更改都是在函数中本地进行的。它们不会更改调用函数中的任何内容。
您可以将这些变量重命名为x
或y
不更改函数的行为。这也将提醒人们 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
改用。在用户空间中定义一个复制标准库函数功能的函数没有任何好处。
推荐阅读
- javascript - 如果取消选择属性,如何在猫鼬中获得虚拟
- python - coingecko api 请求限制如何工作?第二次请求后收到太多请求错误
- python - scipy.optimize 错误:“numpy.float64”对象不可调用
- postgresql - 如何在 postgresql 中生成自定义代码
- vue.js - vue3-openlayers 视图永久移至底部
- vue.js - vuejs发票交易,输入项推送
- google-drive-api - Google Drive Activity API 是否将视图公开为操作?
- javascript - 使用数组从 JSON 获取数据
- sqlite - 将输出格式设置为“表”(.mode 表)时出现 SQLite3 错误
- python - 如何在“_”处拆分字典键并创建二维表?