我对内存指针有点困惑

时间:2010-12-19 17:15:14

标签: c++

我在过去的几天里一直在教自己C ++,并遇到了一些我可以使用一些进一步解释的情况。除了明显的类,命名等之外,下列方法之间有什么区别?

void OnTimer(wxTimerEvent &event) ...

void addNPC(Sprite *spr) ...

接收值的那些方法是否通过引用传递并执行相同的操作?如果是这样,有什么区别?当我第一次开始阅读时,我看到了这样的方法:

addNPC( &sprite );

所以我假设当你编写一个接收内存指针的方法时,在方法参数中你必须像声明一个内存指针/位置一样编写它,而不仅仅是一个值。但后来我看看OnTimer方法,我发现它也有一个传递的引用。有什么区别?

最后,这两件事情是否相同,只是实际的编码风格?

void addNPC(Sprite& spr) ...
void addNPC(Sprite &spr) ...

4 个答案:

答案 0 :(得分:4)

最后一个问题:两个函数原型是等价的。在C或C ++中,空格大多不重要。

至于引用和指针之间的区别,可以将引用视为指针的“语法糖”,并附加限制,它不能为NULL。有关详细信息,请参阅C ++ FAQ:https://isocpp.org/wiki/faq/references

答案 1 :(得分:1)

wxTimerEvent &event是对象的引用。它的行为类似于普通变量,但它引用了函数之外的变量。对本地引用所做的任何更改实际上都在更改原始引用。它本质上是一个指针,您可以作为普通变量访问它,它不能是NULL

Sprite *spr是指向外部变量的真实指针。在本地进行的任何更改也在函数外部进行。它可以是NULL

最后两项完全相同。空格在C / C ++代码中并不重要。

答案 2 :(得分:1)

void addNPC(Sprite *spr)

在上面的代码中,你需要传递Sprite对象的地址,如下所示,因为它接收指针。

addNPC( &sprite );  

对于功能

void OnTimer(wxTimerEvent &event) 

调用必须如下所示,因为它引用了wxTimerEvent对象。

wxTimerEvent evt;
OnTimer(evt);//Passing object by reference.
  

在呼叫地点,语法是相同的   都是按价值传递并经过   参考

对于你的上一个问题,它们都是相同的,只是编码风格的区别。

答案 3 :(得分:1)

除了其他答案之外,还有一个const引用的特性 - 你可以为它分配临时对象,只要const引用处于活动状态,对象就会存在。

string its_alive();

void foo() {
  const string& some_string = its_alive();
  ...
}

因此,如果引用的用户不负责对象的破坏,并且NULL对象没有意义,那么你使用引用。

这是名誉GotW #88,用于解释const对临时对象的引用。