In the first example (char x[] = "a";), the double quotes mean take whatever is inside the quotes and treat this as a string of characters, and add a NULL at the end of the string to mark the end of the string. So
char x[] = {"abcd"};
would define a 5 character string with the character values (in decimal) of 97, 98, 99, 100, 0. Where 97 is the decimal value for the character 'a', and so on, and 0 is the terminating NULL character,
These characters can be represented in hexadecimal as 0x61, 0x62, 0x63, 0x64, 0x00. The 0x is a prefix that C and many other languages take to mean hexadecimal. They can also be represent in octal as 0141, 0142, 0143, 0144, 0. In this case, the leading 0 is treated as an instruction to treat the number as octal.
However, when you use single quotes, C takes the value as a single character. Each single character is still valid as normal, but there is no terminating NULL character provided as single quotes denote individual characters rather than strings.
Without any quotes, C takes a numeric value at its face value, so when you say:
char x[] = {'a', 0};
The 'a' is taken as a single character, which is followed by another character of numeric value 0. This is the NULL that will terminate the string x.
Now, when you use
char x[] = {'a', '0'};
you are defining two characters in x with decimal values of 97 and 48, which are the ASCII codes for a and 0.
When you use a back slash character '\', you are using this as an escape character to allow you to define a character that is not normally available. For example, '\n' means a newline character (decimal value 10); '\r' is a return character (decimal value 13); and '\\' is used to mean a real single back slash. For '\0', this is taken as defining the NULL character, and will produce the decimal value 0 rather than 48 that occurs when you use '0' in single quotes but without the back slash.
Finally, when you used
char x[] = {'a', '0'};
You defined two characters in the array 'x', but you did not terminate the array. x[0] will have the value 'a' and x[1] will have the value 0 (decimal code 48 not the NULL character) as it was in single quotes. The array 'x' is defined as being only two characters long, but if you treat it as a string, then C will run through the following memory locations until it encounters a NULL character, which it will take as the end of the string. Often this will be another variable in the program. For example, with my compiler:
char b[] = {"test"}, a[] = {'d', '0'};
printf("%s\n",a);
produces the result
d0test
My compiler has allocated memory for arrays in reverse order from the order they were defined in the source code. Array 'a' is two characters 'd0' but the printf ran on through the following array until it encountered a NULL character marking the end of the string.
I hope this helps.