可能是重复问题:
何时在C++中传递引用和指针?
按引用传递和通过指针传递值之间有什么区别?
可能是重复问题:
何时在C++中传递引用和指针?
按引用传递和通过指针传递值之间有什么区别?
当你通过引用传递参数时,在函数内部,该参数是从外部传递的变量的别名。而当你通过指针传递变量时,你需要获取该变量的地址并将其传递到函数中。主要区别在于,你可以将值(例如数字)作为常量引用传递到函数中,而无需使用地址,但是你无法将没有地址的值作为常量指针传递到函数中。
通常,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
如果你按值传递,你的朋友不知道糖果来自哪里。它可能来自店里、冰箱里或其他地方。现在,如果你通过引用传递,你的朋友不知道你要给他什么。
与编程有关,糖果是变量的值。指令“在桌子右边饼干罐子那里”是你的变量值所在的内存地址。你将在数据结构中经常使用它,所以 :) 希望我以某种方式帮助了你 xD