In any context except where it is the operand of either the unary &
or sizeof
operators, the array name a
evaluates to a pointer to the first member of the array. This has type int *
.
In &a
, a
still designates the array itself, so &a
is the address of the array. This has type int (*)[2]
.
Since the first element of the array is located at the beginning of the array, the address of the array and the address of the first element are necessarily coincident, so that's why you see the same value.
(Really you should be using the %p
format specifier to print pointers).