为第一个指针指向的对象分配第二个指针

时间:2013-10-25 05:21:44

标签: c++ pointers

我是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
}

currentPlayer功能中的play()作业是否正确? Xcode似乎没有想到,但我仍然对指针赋值和正确使用dereference运算符感到非常困惑。相关问题:此代码是否会将正确的播放器名称插入gameLog?我可以确定将currentPlayer传递给changeGmState()与传递player0player1的工作方式相同吗?任何其他反馈表示赞赏。在此先感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

作业应该是:

if (player0First)
    currentPlayer = player0 ;
else
    currentPlayer = player1 ;

指针只是变量,将地址保存到内存中的某个位置。如果单独使用指针变量,它将只是数据的地址。

*player0

使用此功能时,您将访问存储在内存中地址的数据。

在此分配之后,变量currentPlayer将包含与player0(或player1)相同的地址,如果使用*currentPlayer,您将访问相同的数据(因为它是相同的地址)。

注意:

currentPlayer->name

这只是

的捷径
(*currentPlayer).name

答案 1 :(得分:3)

您在此处取消引用RHS中的指针:

currentPlayer = *player0 ;
//              ^ dereference, gives object pointed at by player0

您需要指定一个指针,即使LHS上的指针与RHS上的指针相同:

currentPlayer = player0 ;

答案 2 :(得分:3)

  

play()函数中currentPlayer的赋值是否正确?

没有。 C ++指针语法有点令人困惑,因为*可能意味着几件事。表达式Player *currentPlayer ;表示您正在创建一个指向Player对象的指针(也就是说,currentPlayer是一个存储Player所在的内存地址的变量。当您说*currentPlayer时,它意味着你希望Player对象存储在那个内存地址(这称为取消引用指针)。说currentPlayer = *player0 ;没有意义;它说要将Player对象(*player0)存储在一个对象中只存储内存地址(currentPlayer指针)。正如已经提到的那样,解决方案就是说

currentPlayer=player0;

基本上意味着“将当前播放器的内存地址设置为与player0指向的内存地址相同”。您也可以将其视为“make currentPlayer指向同一个player0指向的内容。”

关于您的其他问题,

  

“此代码会将正确的玩家名称插入gameLog吗?”

是。 *gameLog正确取消引用gameLog指针。

  

我可以确定将currentPlayer传递给changeGmState的工作方式与传入player0或player1相同吗?

是的,假设currentPlayer已设置为player0player1

答案 3 :(得分:2)

if (player0First)
    currentPlayer = *player0 ;
else
    currentPlayer = *player1 ;

在此处小心 - 您将这两个Player*分配给Player s

摆脱引用:

if (player0First)
    currentPlayer = player0 ;
else
    currentPlayer = player1 ;

答案 4 :(得分:2)

您可以使用

currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0 

currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1