为第一个指针指向的对象分配第二个指针
我完全不熟悉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
一样吗?任何其他反馈意见。在此先感谢您的帮助。
play()函数中currentPlayer的赋值是否正确?
编号C++指针语法有点混乱,因为*可能意味着几件事情。表达式Player *currentPlayer ;
意味着你正在创建一个指向Player对象的指针(也就是说,currentPlayer是一个存储播放器所在位置的内存地址的变量,当你说*currentPlayer
时,这意味着你想让Player对象存储在那个内存地址(这被称为解引用指针),说currentPlayer = *player0 ;
没有任何意义;它说存储一个Player对象(*player0
)在一个只存储内存地址的对象中(currentPlayer
指针)。被提及,就是
currentPlayer=player0;
这基本上意味着“设置当前播放器的内存地址是作为由player0
指向相同的。”你也可以THI它NK为“使currentPlayer
指向同一件事player0
点。”
至于你的其他问题,
“将这段代码插入正确的玩家名字变成gameLog?”
是的。 *gameLog
正确解除对gameLog
指针的引用。
我可以确定传递currentPlayer来改变GmState的工作方式与传入player0或player1相同吗?
是,假设currentPlayer
已被设置为player0
或player1
。
的分配应该是:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
指针只是变量保存的地址在内存中的位置。如果单独使用指针变量,它将只是数据的地址。
*player0
使用此功能时,您正在访问存储在内存地址中的数据。
在此作业之后,变量currentPlayer将包含与player0(或player1)相同的地址,并且如果您使用*currentPlayer
,则将访问相同的数据(因为它是相同的地址)。
注:
currentPlayer->name
这仅仅是一个用于
(*currentPlayer).name
谢谢,我想确保这一点。 – AdamJames
你解引用指针在这里RHS快捷:
currentPlayer = *player0 ;
// ^dereference, gives object pointed at by player0
您需要分配一个指针,也就是说,要使LHS上的指针与RHS上的指针相同:
currentPlayer = player0 ;
if (player0First)
currentPlayer = *player0 ;
else
currentPlayer = *player1 ;
这里小心 - 你要在分配这两个Player*
S的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
谢谢!这帮助我更好地理解C++指针。 – AdamJames