The value of the pointer means "Hello" becomes the part of text segment.Because we can;t change any value in text segment.
The memory for ptr pointer (4-byte ) allocated at stack(local variable) or at Data Segment (If declared globally ) so we can change the pointer reference of ptr ,
But the value pointing by ptr we can't change till it points to the text segments data.
Take this two example
CODE -1
char *ptr = "Hello";
*(ptr + 2) = 'a';
/* Here it will give segmentation fault
Bcoz currently ptr is pointing to data of text segment */
printf("ptr is %s :\n", ptr);
CODE - 2
But see this snippet When the pointer ptr changed to some other place(stack/Data Segment ) Then You can change the value pointed by this pointer.
char *ptr = "Hello";
char str[8] = "World";
ptr = str;
/* Now ptr is not pointing to text segments data */
*(ptr + 2) = 'a';
/* Here We can change the value pointer by ptr as
currently ptr is not pointing to data of text segment
rather it is pointing to stack segments data*/
printf("ptr is %s :\n", ptr);
So conclusion is that text segment data value we should not try to change,so through this the data they are storing permanently.