func(int a[][6]) // This implies that a is going to an array of 6 columns ,right now we don't know the rows fine ,but it is pointing to a 2D array .
I hope you are fine with this declaration. Here a will be having the address of first element a[0][0].
func(int (*a)[6]) //Now how is this notation correct for a to point to a 2D array since it implies that a is a pointer to an array of 6 elements so that implies that it would be pointing to a 1D array .I am unable to get the exact way in this pointer a would be pointing to the 2D array .
As you know passing an array is just sending Base address.
Now in given declaration "int (*a)[6]", as you have mentioned you can access the each row of 6 integers base address.Once you will do (a+1) it will increment to next row base address and so on.
To access the each element of that row you have to just do like below
int *t;
t = a; // As you know a is a pointer to an array of 6 elements.
// It means it can have address to such array of 6 elements.
// we are assigning that base address to a integer pointer.
// Since integer pointer can hold the address of integer element.
// (i.e. first element of first array)
int i;
for( i =0;i<6;i++)
printf("%d", *(t+i);
This way you can access each elements of the 2-D array.