C ++指针表现得很奇怪

时间:2014-06-07 20:30:45

标签: c++ arrays visual-studio pointers

我有一个指针的2D数组,指向那个Class Piece的实例。 我像这样声明数组:

Board.h:

private:
    typedef std::array<Piece**, Board::BOARD_SIZE> row_type;
    typedef std::array<row_type, Board::BOARD_SIZE> array_type;
    array_type* grid;

之后,此代码运行:(这就是问题所在)

grid = &array_type();
for (int i = 0; i < Board::BOARD_SIZE; i++) {
    for (int j = 0; j < Board::BOARD_SIZE; j++) {
        (*grid)[i][j] = NULL;
    }
}
(*grid)[3][3] = &Piece::white;
(*grid)[4][4] = &Piece::white;
(*grid)[3][4] = &Piece::black;
(*grid)[4][3] = &Piece::black;

ofstream fout;
fout.open("Debug.txt");
fout << "Board cpp" << &Piece::white << endl;
fout << "Board cpp 2" << (*grid)[3][3] << endl;
fout.close();

Piece :: white&amp;黑色变量在Piece类中是静态的,并在此代码运行之前进行初始化。

如你所见,奇怪的是我运行这句话:

(*grid)[3][3] = &Piece::white;

然而,当我打印出每一侧的地址时,我会得到不同的地址!为什么是这样?我是C ++的新手,所以请放轻松我!

2 个答案:

答案 0 :(得分:1)

第一个问题:你如何打印&#34;每一方的地址&#34;?

原则上,那行代码

(*grid)[3][3] = &Piece::white;

只需将Piece::white的地址复制到由grid [3] [3]中存储的地址标识的变量中。地址本身(即grid[3][3])不应该改变,只改变它指向的值。

答案 1 :(得分:1)

这条线不好:

grid = &array_type();

您正在grid中存储临时对象的地址。访问grid的任何内容都会受到未定义的行为。

我建议将其改为

grid = new array_type();