#include <iostream>
using namespace std;

int main()
{
    //可以使用指针创建任意大小的一维数组,同理,使用指向指针的指针创建任意大小的二维数组
    int **p_p_tictactoe;  //有一个一位数组的指针,这些指针每一个都指向第二个一位数组
    p_p_tictactoe=new int*[3];   //注意int*,因为要分配一个指针数组

    for (int i = 0; i <3 ; ++i) {  //现在,让每个指针都存储整数数组的地址
        p_p_tictactoe[i]=new int[3];
    }

    for (int j = 0; j <3 ; ++j) {   //这是可以像使用二维数组一样地使用分配的内存了
        for (int i = 0; i < 3; ++i) {
            p_p_tictactoe[i][j]=i;
        }
    }
    for (int j = 0; j <3 ; ++j) {
        for (int i = 0; i < 3; ++i) {
            cout<<p_p_tictactoe[i][j]<<" ";
        }
    }

    //要释放内存,要按照同初始化相反的顺序执行——先释放每一行的指针,然后释放掉指向这些行的指针
    for (int k = 0; k < 3; ++k) {
        delete []p_p_tictactoe[k];
    }
    delete [] p_p_tictactoe;
    return 0;
}