I noticed that string literals have very different addresses in memory than other constants and variables (Linux OS): they have many leading zeros (not printed).
const char * h = "Hi";
int i = 1;
printf ("%p\n", h);
printf ("%p\n", &i);
Here's how process memory is laid out on Linux (from http://www.thegeekstuff.com/2012/03/linux-processes-memory-layout/):
The .rodata section is a write-protected subsection of the Initialized Global Data block. (A section which ELF executables designate .data is its writable counterpart for writable globals initialized to nonzero values. Writable globals initialized to zeros go to the .bss block.).
The picture should explain the numerical values of your addresses.
Note: To comply with the standard, you should cast the
(void*) or else the behavior is undefined.