Like many answers have already stated const char *c is read as follows:
c is a pointer to a const char
If you are not familiar with pointers, a pointer holds the address of some 'object' in memory.
Your two strings, "Hello" and "there!" are string literals. At compile time (minus compiler optimizations), they are placed in the text/rodata segment of the code. Not sure if you are familiar with the layout of an executable in memory (also known as the runtime environment), but you have the Text, Data, BSS, Heap and Stack.
At runtime, the char pointer is allocated on the stack and is first set to point to the area in memory where the string "Hello" is, and then in your second statement, the pointer is set to point to "there!"
Both of those strings are literally a contiquous block of bytes in memory and your pointer is just pointing to the start of one and then the other.
So even though it appears as if you were creating those strings on the stack, that actually isn't the case.
On the other hand, if you had declared the string as follows,
char ch[] = "Hello";
then you could not reassign ch to point to "There" because ch is a non-modifialble l-value in this case.
This goes a little beyond your question, but hopefully it will help you understand a little more of what the code looks like under the hood.