Two dimensional array and pointer to one dimensional array

First, the previous two-dimensional array:

int a[3][4]={1,2,3,4,5,6,7,8,9,1,2,3};

How to operate a pointer for a two-dimensional array like this:
the first concept is that a two-dimensional array has rows and columns.

    the first point is that the * operator accesses the column, and the second point is that the [] subscript operator also accesses the column.

For example, a, * a, a [2], * (a + 2)
A: A is the address of the first row, while * a is the address of the first row and zero column, which is the address of the first row and zero column.
A [2]: the subscript accesses the column of the row, that is, the address of two rows and 0 column.
* (a + 2): a + 2 accesses the address at the beginning of the second line, and a * sign accesses the address at column 0 of the second line.

Pointer to one-dimensional array: int (* P) [4];
when this pointer P points to a two-dimensional array, every P + 1 skips four elements and points directly to the next line.

Read More: