That is how array names behave in C
.
The name of the array variable represents the address of the first element of the array.
so,
void *p = array; //array name, gives address of the first element.
and
void *q = &array; //adress-of-array name, also gives address of the first element
// actually &array is of type int (*)[16] which is decayed to int *
// and casted to void * here
P.S. Even, FWIW,
void *r = &array[0]; //address of the first element
will also give you the same address.
This will give out the same address and no compiling error.
They are indeed same value, and here compiler has nothing to scream about.
Point to note: once you assign the address(es) to a void pointer, you'll lose the type information associated with them.