簡體   English   中英

將第二個指針分配給第一個指針指向的對象

[英]Assigning a second pointer to object pointed by first pointer

我是C ++的新手,我唯一的編程經驗就是Java。 我仍在嘗試獲取指針的句柄。 我將如何分配一個指針指向第二個指針指向的同一對象? 具體來說,我想分配currentPlayer指向player0player1 ,並隨着游戲狀態的改變來回切換。

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()的方式與傳遞player0player1嗎? 任何其他反饋表示贊賞。 在此先感謝您的幫助。

作業應為:

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已設置為player0player1

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.

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