From the K&R C book,
There is an important difference between these definitions:
char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
amessage is an array, just big enough to hold the sequence of characters and '\0' that initializes it. Individual characters within the array may be changed but amessage will always refer to the same storage. On the other hand, pmessage is a pointer, initialized to point to a string constant; the pointer may subsequently be modified to point elsewhere, but the result is undefined if you try to modify the string contents.
In this context, they are saying amessage is an array located at an immutable address that contains enough storage. Makes sense.
Here's the part I don't get: pmessage is a pointer pointing to a string constant. But where is this string constant located? Is memory set aside by the computer automatically? How can modifying the string change where pmessage is located? And why isn't the string constant a character array? It was to my understanding C wasn't able to process an entire string of characters as one unit.