But then there's another problem: what does it mean to say "c[0]=new char[]"?
And how did cout know to print "1 st" rather than "0x03cb6b45" or what ever the four byte hexadecimal representation is?
Since c is an array of arrays, it tells the compiler that the first element of c is a new character array with an unknown size. It didn't "know"...it's just that since c[0] is an array of chars, it will print out the array for you.
What? Says who?
new char (no []), new char*, new char**, new char***, ad nauseam, are all valid in C++.
You can create arrays of things, of any size as long as the size is >0. If the size is 1, the [] can be omitted. The [] can never be empty for dynamic allocation.