In C strings were like this: char* string = "Hello world";
and on C++ any char* is thought to be a C-style string for compatibily reasons.
so if you declare char sex;, sex is a char and &sex is a char* (pointer to a char). The output of a char* acts like a string.
A void* is a pointer to any type of variable so the output for that will be the reference and not the string translation of it.
Because C-strings were, as Bazzy said, char*, ostream thinks that when you tell it to output a char* you really mean you want it to output a C-string. But other pointer types don't have any other meaning, so ostream just outputs the pointer value.