将第二个指针分配给第一个指针指向的对象
Posted
技术标签:
【中文标题】将第二个指针分配给第一个指针指向的对象【英文标题】:Assigning a second pointer to object pointed by first pointer 【发布时间】:2013-10-25 05:21:43 【问题描述】:我对 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
的工作方式相同吗?任何其他反馈表示赞赏。提前感谢您的帮助。
【问题讨论】:
【参考方案1】:play() 函数中给 currentPlayer 的赋值是否正确?
没有。 C++ 指针语法有点令人困惑,因为 * 可能意味着几件事。表达式Player *currentPlayer ;
表示您正在创建一个指向 Player 对象的指针(即 currentPlayer 是一个变量,用于存储 Player 所在的内存地址。当您说 *currentPlayer
时,表示您想要 Player存储在该内存地址的对象(这称为取消引用指针)。说currentPlayer = *player0 ;
并没有真正意义;它表示将播放器对象(*player0
)存储在仅存储内存地址的对象中(@987654325 @pointer). 解决方法,正如已经提到的,就是说
currentPlayer=player0;
这基本上意味着“将当前播放器的内存地址设置为与player0
所指向的相同”。你也可以把它想象成“让currentPlayer
指向同一个东西player0
指向。”
关于您的其他问题,
“这段代码会在gameLog中插入正确的玩家名字吗?”
是的。 *gameLog
正确地取消引用 gameLog
指针。
我可以确定将 currentPlayer 传递给 changeGmState 与传递 player0 或 player1 的工作方式相同吗?
是的,假设 currentPlayer
已设置为 player0
或 player1
。
【讨论】:
【参考方案2】:您在此处取消引用 RHS 中的指针:
currentPlayer = *player0 ;
// ^ dereference, gives object pointed at by player0
你需要分配一个指针,也就是让LHS上的指针和RHS上的指针指向同一个东西:
currentPlayer = player0 ;
【讨论】:
【参考方案3】:作业应该是:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
指针只是一个变量,用于保存指向内存中某个位置的地址。如果单独使用指针变量,它只是数据的地址。
*player0
当使用它时,您正在访问存储在内存地址中的数据。
在此分配之后,变量 currentPlayer 将包含与 player0(或 player1)相同的地址,如果您使用 *currentPlayer
,您将访问相同的数据(因为它是相同的地址)。
注意:
currentPlayer->name
这只是一个快捷方式
(*currentPlayer).name
【讨论】:
谢谢,我想确认一下。【参考方案4】:if (player0First)
currentPlayer = *player0 ;
else
currentPlayer = *player1 ;
这里要小心——您将这两个Player*
s 分配给Player
s
摆脱取消引用:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
【讨论】:
【参考方案5】:你可以使用
currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0
currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1
【讨论】:
以上是关于将第二个指针分配给第一个指针指向的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭