This:
const char * terry = "hello";
cout<<terry;
prints hello
instead of the memory address of the 'h'
. Why is this happening?
This:
const char * terry = "hello";
cout<<terry;
prints hello
instead of the memory address of the 'h'
. Why is this happening?
The
<<
operator onstd::cout
is overloaded. Its behavior depends on the type of the right operand. (It's actually several different functions, all namedoperator<<
; the compiler decides which one to call.)If you give it a
char*
orconst char*
, it treats the operand as a pointer to (the first character of) a C-style string, and prints the contents of that string:If you give it a
char
value, it prints that value as a character:If you give it a pointer of type
void*
, it prints that pointer value (in some implementation-defined way, typically hexadecimal):Treating a
char*
orconst char*
as a pointer to a C-style string is a special case, and the only one (that I can think of) that causesoperator<<
to print something other than the value of the operand. The reason for this goes back to C++'s roots in C, which doesn't have a "string" type and manipulates strings viachar*
pointers.There are numerous other overloads for
operator<<
, for various integer and floating-point numeric types, forstd::string
, and so forth."hello" is a string, i.e. the char array.
const char*
is a pointer to this array, so when you dereference this pointer, you get the value of the first element.It is like if you have
you get just
1
printed.The reason for that is that
std::cout
will treat achar *
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:(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: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:outputting (the address may be different in your environment):
Note that, when using the
static_cast
, you should ensure you don't try to cast away the constness withstatic_cast <void *>
(that's whatconst_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.cout is overloaded so that when you give it a char*, it will print as a pointer to a C style string. So, it prints out the characters until it hits a null terminating character.
If you used printf instead of cout, you would see the address. You could also cast the pointer to another type, say (void*) and you would also get the address.
You should change your code to this:
The problem is that
<<
operator is overloaded for pointers to C-style strings for printing the content of the string. If you cast it to the raw pointer instead, you will have the default behaviour of printing pointer using iostreams as you want.