A string in 'C' is not a special data type or a new kind of data object. Nor does it involve any special operators. It is only a particular way of viewing an 'array of char' which, by convention, all agree to because of its simplicity and efficiency. A string literal is a special case of an unnamed array (but of known address) initialized at compile time. To illustrate:
char message[42]; /* this is or can be used as a string */ char *p; p="This is a string literal (between the quote marks)";
A string or string literal has type: pointer to "char".
A string in 'C' means an array of char one of which must be the NUL (all bits zero) character. This array of characters, as all arrays, has a size. This represents the maximum length of the string minus one (for the NUL character). Thus a string of length zero is an array whose first character is the NUL character; e.g. message[0]=0.
Remember 0 is not the null character. This is the zero character, whose value in ASCII is 48. It would print as a zero on the screen or a page, while the NUL character would not print at all nor would it cause the cursor or printing position to move.
There may be characters beyond the NUL byte in the array which holds the string, but these are by convention ignored. They just provide for the possibility of putting a bigger string in the array if needed.
By convention, any array of char that has a NUL terminated string in it is used in a way such that the beginning of the array marks the beginning of the string with the zeroth element of the array as the first character in in the string; and the NUL byte comes after the last character in the string. If the first character, i.e. the zeroth, is NUL, then string is called a null string. The length of a string does not include the NUL character, while the length or size of the array is independent of its contents.
The 'C' library provides many functions which adhere to this convention
and operate on strings in the form described above. See