As you can see, instead of getting the address of b[0] or b[3], the program outputs the string itself starting from the the position I wrote, and ends in '\0'.
The reason is that the operator<< is overloaded for constchar * and other pointer differently. So if you provide a pointer to char the string is printed instead of the address.
Let's phrase it so: The stream (cout) 'knows' what a string is and prints it accordingly. If a pointer to another type is provided it prints the value of the pointer.