Consider the code:
int main(void) { int a; }
As far as I know, int a; is a definition, as it causes storage to be reserved
int a;
This is a definition There is a memory allocated for variable a
a
extern int a;
This is a declaration. Memory is not allocated because it is not defined.
Once a variable is defined you can use the address of it which is totally legal.