In terms of C, the most significant difference between c3 and others is that you are not allowed to change the underlying characters with c3 . It is often useful for me to think of it this way:
char *xyz = "xyz";
creates a mutable pointer on the stack and makes it a point in an immutable sequence of characters {'x','y','z','\0'} . On the other hand,
char xyz[] = "xyz";
will create a modifiable array on the stack large enough to hold the sequence of characters {'x','y','z','\0'} , and then copy this sequence of characters into it. Then the contents of the array can be modified. Keep in mind that the standard does not say anything about stacks, but this is usually done. In the end, it's just a memory.
Formally, c3 is a pointer to a string literal, and c1 and c2 are both arrays of characters that end with a null character. When they are passed to functions such as printf , they decay to a pointer to the first element of the array, which means that in this function they will be processed the same way as c3 (in fact, they decay under quite a lot of circumstances, see the third quote from c99 below for exceptions) .
The relevant sections of C99 are 6.4.5 String literals , which explain why you are not allowed to change what c3 points to:
It is not indicated whether these arrays are different if their elements have corresponding values. If the program tries to change such an array, the behavior is undefined.
and why it has a null limiter:
In phase 7 of the translation, a byte or null code is added to each multibyte character sequence that is obtained from a string literal or literals.
And 6.3.2.1 Lvalues, arrays, and function designators in 6.3 Conversions say:
Unless it is an operand of the sizeof or unary operator and the operator, or is a string literal used to initialize an array, an expression that is of type type '' type is converted to an expression with a type pointer '' for input, which points to the source element of an array object and is not an lvalue value. If the array object has a register storage class, the behavior is undefined.