可能重复:
When to pass by reference and when to pass by pointer in C++?
通过引用传递和通过指针传递值有什么区别?
答案 0 :(得分:17)
当您通过引用传递参数时,函数内的参数是您从外部传递的变量的别名。当您通过指针传递变量时,您将获取变量的地址并将地址传递给函数。主要区别在于您可以将没有地址(如数字)的值传递给一个带有const引用的函数,而不能将无地址值传递给一个带有const指针的函数。
通常,C ++编译器将引用实现为隐藏指针。
您可以通过以下方式将函数更改为指针变量:
void flip(int *i) // change the parameter to a pointer type
{
cout << " flip start "<<"i="<< *i<<"\n"; // replace i by *i
*i = 2*(*i); // I'm not sure it the parenthesis is really needed here,
// but IMHO this is better readable
cout << " flip exit "<<"i="<< *i<<"\n";
}
int main()
{
int j =1;
cout <<"main j="<<j<<endl;
flip(&j); // take the address of j and pass this value
// adjust all other references ...
}
答案 1 :(得分:1)
对于问题的第二部分,这是代码。
#include <iostream>
#include <cassert>
using namespace std;
void flip(int *i)
{
cout << " flip start "<<"i="<< i<<"\n";
*i *= 2;
cout << " flip exit "<<"i="<< i<<"\n";
}
int main()
{
int j =1;
cout <<"main j="<<j<<endl;
flip(&j);
cout <<"main j="<<j<<endl;
flip(&j);
cout <<"main j="<<j<<endl;
flip(&j);
cout <<"main j="<<j<<endl;
assert(j==8);
return 0;
}
对于你的问题的第一部分,我是C ++的新手但我发现当必须为函数返回多个输出时传递指针很有用。或者将NULL作为参数传递。
答案 2 :(得分:-1)
从技术上讲,你只需要在变量名之前加一个星号来通过引用传递;)然后它会传递变量在你记忆中的地址。
现在通过引用传递和传递值的差异很简单。想到这一点......想象自己想给你的朋友送糖果。
如果你通过值... 你:嘿,我要给你点什么.. 朋友:这是什么? 你在这里 朋友:谢谢xD
如果你通过参考传递.. 你:嘿,我要给你点什么.. 朋友:这是什么? 你:它位于桌子右侧的饼干罐子里 朋友:谢谢xD
如果你超过价值,你的朋友不知道糖果来自哪里。它可能来自商店,冰箱或任何地方。现在,如果你通过参考,你的朋友不知道你要给他什么。将它与编程相关联,糖果是变量的值。指令“它位于cookie罐的表格右侧”是变量值所在的存储器地址。你非常愿意在数据结构中使用它,所以是啊:)希望我以任何方式帮助你xD