printf("%u %u ",a ,&a); //a
printf("%d %d ", *a ,*&a); //b
a decays to the pointer to the first element of the array.
&a is the pointer to the array of 4
Even though the numerical values of the two pointers are the same, the pointers are not of the same type.
a (after it decays to a pointer) is
&a is a pointer to an array of 4
*a is an
*&a is an array of 4 ints -
int , which decays to the pointer to the first element in your expression.
printf("%d %d ", *a ,*&a);
is equivalent to:
printf("%d %d ", *a , a);
BTW, You should use
%p for pointers. Otherwise, you invoke undefined behavior. Increase the warning level of your compiler to avoid making such errors.