【发布时间】:2011-05-05 07:03:15
【问题描述】:
【问题讨论】:
-
这个问题在 SO 上大约有十亿个重复项。请参阅右侧的相关列表。
-
对不起,我应该在发布问题之前检查答案。我会要求版主删除这个。
标签: c++
【问题讨论】:
标签: c++
当您通过引用传递参数时,函数内部的参数是您从外部传递的变量的别名。当您通过指针传递变量时,您获取变量的地址并将地址传递给函数。主要区别在于您可以将没有地址的值(如数字)传递给采用 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 ...
}
【讨论】:
对于你问题的第二部分,这里是代码。
#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 作为参数传递。
【讨论】:
从技术上讲,您只需在变量名称前加一个星号即可通过引用传递;)现在它将传递变量在内存中的地址。
现在引用传递和值传递的区别很简单。这么想吧.. 想象一下你自己想给你的朋友一颗糖果。
如果你按值传递.. 你:嘿,我给你点东西。。 朋友:那是什么? 你在这里 朋友:谢谢xD
如果你通过引用传递.. 你:嘿,我给你点东西。。 朋友:那是什么? 你:它在饼干罐所在的桌子的右侧 朋友:谢谢xD
如果你按值传递,你的朋友不知道糖果是从哪里来的。它可能来自商店、冰箱或任何地方。现在如果你通过引用,你的朋友不知道你会给他什么。
把它和编程联系起来,糖果就是变量的值。指令“它在 cookie jar 所在的表格的右侧”是变量值所在的内存地址。你会在数据结构中使用它,所以是的:) 希望我能以任何方式帮助你 xD
【讨论】: