cout

The reason for that is that std::cout will treat a char * as a pointer to (the first character of) a C-style string and print it as such. If you want the address instead, you can just cast it to a pointer that isn’t treated that way, something like:

cout << (void *) terry;

(or use the const void * cast if you’re worried about casting away constness, something that’s not an issue in this particular case).


If you’re more of a purist than pragmatist, you can also use the C++ static_cast, along the lines of:

cout << static_cast <const void *> (terry);

though it’s unnecessary in this particular case, the cast to a void * will work fine. The following sample code shows all these options in action:

#include <iostream>
int main (void) {
    const char *terry = "hello";
    std::cout << terry << '\n';
    std::cout << (void *) terry << '\n';
    std::cout << (const void *) terry << '\n';
    std::cout << static_cast<const void *> (terry) << '\n';
    return 0;
}

outputting (the address may be different in your environment):

hello
0x8048870
0x8048870
0x8048870

Note that, when using the static_cast, you should ensure you don’t try to cast away the constness with static_cast <void *> (that’s what const_cast is for). This is one of the checks done by the newer C++ casts and the old-style cast does not have this limitation.

Leave a Comment