&q has a different type to q, so any good compiler would complain about incompatible pointer assignments
yes, you're right.
even though it works for this trivial example, not casting it properly is a bad habit to get into.
the correct way to initialize it is:
char q[16];
char *p = [b](char *)[/b]&q;
strcpy(q,"abc");