我正在努力理解这段代码:
int **p_p_tictactoe;
p_p_tictactoe = new int*[ 3 ];
for ( int i = 0; i < 3; i++ )
{
p_p_tictactoe[ i ] = new int[ 3 ];
}
在行上: p_p_tictactoe[i] = new int [3];
方括号取消引用p_p_tictactoe一次,以便我们查看p_p_ticatactoe存储的地址的值,这是另一个地址,因为它是指向指针的指针。然后将此地址分配给一个新的int,但不应该将其分配给地址处的值而不是地址本身,如下所示:*p_p_tictactoe[i] = new int[3]
p_p_tictactoe
是一个int **
。
因此,p_p_tictactoe[i]
必须是int *
.
所以,*p_p_tictactoe[i]
一定是一个单身、孤独、int
。
将 new
的结果(此处为int *
(分配给int
不会有任何有用的结果。
另一种有用的看待方式是:*p_p_tictactoe[i]
等同于p_p_tictactoe[i][0]
。显然,这是一个int
,一个单元格,将指针塞进去,是行不通的。
No.
*p_p_tictactoe[i]
(也拼写为 p_p_tictactoe[i][0]
(将是您在该行上创建的数组中的int
之一。
顺便说一句,这是一个非常低效的内存布局。除非您的数组可能会改变尺寸或呈锯齿状,否则最好使用单个 int
块,并在顶部伪造 2D 索引。