I believe Labdabeta answered the first question well. As for your second question you can technically do this...
const *p = (const *)0x05; // Constant pointer address char *a = (char *)p; // Assign this address to a character array printf("%p", a); // View the address of the character array
This will print out "0x5".
It is not advisable to work with pointers this way unless you are certain of the memory mapping. While programming in C you essentially give up control of the memory mapping and let C and the Operating System deal with that for you.
Of course if you are certain of the memory mapping (such as with embeded devices or OS programming) by all means create constants for these "POKE"-style addresses. This is usually done as a series of #define lines in headers.