Whats interesting to me is that we are saying &test[0] is equivalent to test. They have the same value, but they are different aren't they? An address (&test[0]) is just an address which could be pointing to any object...test is a pointer "with type", i.e. it is more than an address, it can be incremented in an intelligent way. So when cout encounters &test[0] how does it know it is a "pointer to a char".