"Strings" when represented as a sequence of characters (like in char c[4]) are terminated by a special character, which you call the NULL character (actually '\0'). As datatypes like char c[4] do not maintain any additional information on the length of the string, this is the convention followed by functions interpreting an object of type char[] as a string to "know where to stop". cout interprets an input of type char[] as such a string and will stop before outputting this character, i.e. it will not print a space or something else. So character 'c' will be the last one to print, and whenn printing a "d" right afterwards no speparator will show up in between.
Note that char c[4]={'a', 'b', 'c'} will work, too, though the reason is a little bit subtle. Initializing a sequence of characters this way will - even if you pass less characters in the brace initializer than you declare as the size of the array - will implicitly fill up the array with '\0'. So it works. char c[4]={'a', 'b', 'c', 'd'}, in contrast, will yield undefined behaviour once you use this character sequence in a function that expects a '\0'-terminated string.
c[3]doesn't even exist.