Because "strings" are arrays, and as you know, an array reference decays into a pointer to the first element of that array.
The compiler takes each "string", and effectively turns it into
Code:
static const char anonymous_string_1[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
So when you write
p="Hello";
the compiler has done something like
p = anonymous_string_1;
> 3. And why cin>>p doesn't work?
Because the "string" is a const, and you can't modify things which are constant.
On most systems, a "string" is also stored in read-only memory. Attempting to write to it causes the OS to just kill the program with a segmentation fault (or similar).