Here is a code snippet :

Code:
int a[2][2] = {
                    {7, 12},
                    {2, 7} 
                  }; 

printf("\n%u %u %u", a + 1, *(a + 1), a[1]);
All 3 would return the same value i.e., address of 1th 1 - D array.

As far as I know, when the compiler encounters a reference to 2 - D array, in this case, for instance, 'a' it decays to int (*a)[2]. When I say a + 1, it moves to 1th 1 - D array, but when I say *(a + 1), instead of giving the output 2, it again gives me the address & not the value because all that is happening by saying *(a + 1) is, that it is being converted from pointer to array to just a pointer. Is that right ?

The book I referred, seems to have a vague explanation, so I just need to confirm.