簡體   English   中英

我對內存指針有些困惑

[英]I am a little confused about memory pointers

最近幾天我一直在自學C ++,遇到了一些情況,可以在此做進一步的解釋。 除了明顯的類,命名等之外,以下方法之間還有什么區別?

void OnTimer(wxTimerEvent &event) ...

void addNPC(Sprite *spr) ...

這兩個方法都接收通過引用傳遞的值並執行相同的操作嗎? 如果是這樣,有什么區別? 剛開始閱讀時,我看到了這樣的方法:

addNPC( &sprite );

因此,我假設當您編寫一個將接收內存指針的方法時,必須在方法參數中像聲明一個內存指針/位置(而不只是一個值)一樣編寫它。 但是,然后我看了OnTimer方法,並且看到它也傳遞了一個引用。 有什么不同?

最后,這兩件事是否相同,只是實際的編碼樣式?

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

首先要問的最后一個問題:這兩個函數原型是等效的。 空格在C或C ++中大多不重要。

至於引用和指針之間的區別,可以將引用視為指針的“語法糖”,並附帶其他限制,即不能為NULL。 有關更多信息,請參見C ++常見問題解答: https : //isocpp.org/wiki/faq/references

wxTimerEvent &event是對對象的引用。 它的行為類似於普通變量,但外觀類似於函數外部的變量。 對本地引用所做的任何更改實際上都是在更改原始引用。 本質上,它是一個指針,您可以將其作為普通變量訪問,並且不能為NULL

Sprite *spr是指向外部變量的真實指針。 在本地對其所做的任何更改也都在功能之外進行。 可以為NULL

最后兩項相同。 在C / C ++代碼中,空格並不重要。

void addNPC(Sprite *spr)

在上面的代碼中,您需要像下面一樣傳遞Sprite對象的地址,因為它接收到指針。

addNPC( &sprite );  

而對於功能

void OnTimer(wxTimerEvent &event) 

調用必須像下面這樣,因為它引用了wxTimerEvent對象。

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

在調用位置,按值傳遞和按引用傳遞的語法均相同。

對於最后一個問題,它們都是相同的,只是編碼樣式不同。

除了其他答案外,const引用還有一個功能-您可以為其分配臨時對象,只要const引用仍處於活動狀態,對象就會存在。

string its_alive();

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

因此,如果引用的用戶不負責對象的銷毀並且NULL對象沒有意義,則可以使用引用。

這是榮譽的GotW#88 ,解釋了對臨時對象的const引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM