As you have probably found, you cannot do:
newBoard = &dirtyBoard;
The syntax above however will work like this:
int newBoard[9][9];
int* dirtyBoard;
int i, j;
for(i = 0; i < 9; ++i)
for(j = 0; j < 9; ++i)
newBoard[i][j] = i*j;
dirtyBoard = newBoard;
However, then you are not copying, you are effectively making an alias. If you update a value in the pointer you will also update the underlying array and vice versa.
If you want to edit the array via the pointer you can do this sort of thing:
#define cols 9
#define rows 9
...
int n;
int newBoard[rows][cols];
int* dirtyBoard;
int i, j;
int row = 3;
int col = 5;
dirtyBoard[row * cols + col] = 3; /* to flip from 1 dimensional ptr -> [][] form */
With C++ you don't need to use define's you can use:
const int rows = 9; // and use as array dimensions.