Ok, I think I understand what was being asked in the 1st place. The OP was wondering why you didn't have to allocate memory (not dereference) for the pointers.
The compiler sets the pointer to point to string literals in the example provided. It's implementation defined as to how the compiler does this and where the actual string literals reside in memory. The caveat here is that you may not modify what these pointers point to.
In fact, if you had these two assignments:
char *p1="hello";
char *p2="hello";
The compiler very well might set them to point to the same region of memory.
As an aside, this is another difference between arrays and pointers:
char *a="hello";
char b[6]="world";
a[0]='M' /* Wrong! Illegal to modify the string */
b[0]='M' /* No problem, the 'w' is changed to 'M' */
Russ
bobbitts@hotmail.com