String refers to a sequence of characters represented as a single data type. Character Array is a sequential collection of data type char. Strings are immutable.
String literal as a Pointer String literals are stored just like arrays. The most important point to understand is that a string literal is a pointer to the first character of the array.
String literals are stored in C as an array of chars, terminted by a null byte.
A pointer contains an address . That address can come from anywhere. A string is a NUL-terminated array of characters.
Inspired by this question.
We can initialize a char pointer by a string literal:
char *p = "ab";  And it is perfectly fine. One could think that it is equivalent to the following:
char *p = {'a', 'b', '\0'};  But apparently it is not the case. And not only because the string literals are stored in a read-only memory, but it appears that even through the string literal has a type of char array, and the initializer {...} has the type of char array, two declarations are handled differently, as the compiler is giving the warning:
warning: excess elements in scalar initializer
in the second case. What is the explanation of such a behavior? 
Update:
Moreover, in the latter case the pointer p will have the value of 0x61 (the value of the first array element 'a') instead of a memory location, such that the compiler, as warned, taking just the first element of the initializer and assigning it to p.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With