There is an overload for operator<<() that takes a const char * as its right hand operand and sends to the output stream the string that the pointer points to. If that overload was defined differently, you wouldn't be able to do this:
std::cout <<"Hello, World!\n"
You'd just get the address of the string.
To treat the pointer as a pointer, cast to void *: cout << (void *)&arr[0] << endl;