[英]Assigning a second pointer to object pointed by first pointer
我是C ++的新手,我唯一的編程經驗就是Java。 我仍在嘗試獲取指針的句柄。 我將如何分配一個指針指向第二個指針指向的同一對象? 具體來說,我想分配currentPlayer
指向player0
或player1
,並隨着游戲狀態的改變來回切換。
using namespace std ;
struct Player {
public:
string name ;
//fields
};
class Game {
private:
Player *player0 ;
Player *player1 ;
Player *currentPlayer ;
bool player0First ;
stringstream *gameLog ;
//more fields
public:
void play() ;
void changeGmState(Player*) ;
//other member functions, etc.
} ;
void Game::play() {
if (player0First)
currentPlayer = *player0 ;
else
currentPlayer = *player1 ;
*gameLog << "It's " << currentPlayer->name << "'s turn!" << endl ;
changeGmState(currentPlayer) ;
//code
}
play()
函數中對currentPlayer
的分配是否正確? Xcode似乎沒有考慮,但是指針分配和正確使用解引用運算符仍然讓我感到困惑。 相關問題:此代碼是否將正確的玩家名稱插入gameLog
? 我可以確定將currentPlayer
傳遞給changeGmState()
的方式與傳遞player0
或player1
嗎? 任何其他反饋表示贊賞。 在此先感謝您的幫助。
作業應為:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
指針只是變量,用於保存內存中的地址。 如果單獨使用指針變量,它將僅是數據的地址。
*player0
使用此功能時,您正在訪問存儲在存儲器中地址處的數據。
分配后,變量currentPlayer將包含與player0(或player1)相同的地址,如果您使用*currentPlayer
,則將訪問相同的數據(因為它是相同的地址)。
注意:
currentPlayer->name
這只是一個捷徑
(*currentPlayer).name
您在這里取消引用RHS中的指針:
currentPlayer = *player0 ;
// ^ dereference, gives object pointed at by player0
您需要分配一個指針,即使LHS上的指針指向與RHS上的指針相同的對象:
currentPlayer = player0 ;
play()函數中對currentPlayer的分配是否正確?
否。C++指針語法有點混亂,因為*可能表示幾件事情。 表達式Player *currentPlayer ;
表示您正在創建指向Player對象的指針(即currentPlayer是一個變量,用於存儲Player所在的內存地址。當您說*currentPlayer
,表示您希望將Player對象存儲在該內存地址(這稱為取消引用指針)。說currentPlayer = *player0 ;
並沒有真正的道理;它表示將Player對象( *player0
)存儲在僅存儲內存地址( currentPlayer
指針)的對象中。正如已經提到的那樣
currentPlayer=player0;
這基本上意味着“將當前播放器的內存地址設置為與player0
指向的內存地址相同”。 您也可以將其視為“使currentPlayer
指向player0
指向的同一player0
”。
關於其他問題,
“此代碼會將正確的玩家名稱插入gameLog嗎?”
是。 *gameLog
正確取消了gameLog
指針的引用。
我可以確定將currentPlayer傳遞給changeGmState的工作原理與傳遞player0或player1一樣嗎?
是的,假設currentPlayer
已設置為player0
或player1
。
if (player0First)
currentPlayer = *player0 ;
else
currentPlayer = *player1 ;
請注意-您要將這兩個Player*
都分配給Player
擺脫取消引用:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
您可以使用
currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0
currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.