此:
const char * terry = "hello";
cout<<terry;
打印hello
而不是'h'
的内存地址。为什么会这样?
答案 0 :(得分:66)
原因是std::cout
会将char *
视为指向C风格字符串(的第一个字符)的指针并将其打印出来。如果你想要地址,你可以把它投射到没有处理的指针,如:
cout << (void *) terry;
(如果您担心丢弃常量,请使用const void *
强制转换,这在某些特定情况下不是问题。)
如果你更像一个纯粹主义者而不是实用主义者,你也可以使用C ++ static_cast
,如下所示:
cout << static_cast <const void *> (terry);
虽然在这种特殊情况下不需要,但void *
的强制转换可以正常工作。以下示例代码显示了所有这些选项:
#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;
}
输出(您的环境中的地址可能不同):
hello
0x8048870
0x8048870
0x8048870
请注意,在使用static_cast
时,您应确保不要尝试使用static_cast <void *>
抛弃常量(这是const_cast
的用途)。这是较新的C ++演员表所做的检查之一,而旧式演员表没有这个限制。
答案 1 :(得分:17)
<<
上的std::cout
运算符已超载。它的行为取决于右操作数的类型。 (它实际上是几个不同的函数,都命名为operator<<
;编译器决定调用哪个函数。)
如果你给它一个char*
或const char*
,它会将操作数视为指向C风格字符串(的第一个字符)的指针,并打印该字符串的内容:
const char * terry = "hello";
cout << terry; // prints "hello"
如果给它一个char
值,它会将该值打印为字符:
cout << *terry; // prints "h"
cout << terry[0]; // the same
如果你给它一个类型为void*
的指针,它会输出指针值(以某种实现定义的方式,通常是十六进制):
cout << static_cast<const void*>(terry); // prints something like 0x4008e4
将char*
或const char*
作为指向C风格字符串的指针处理是一种特殊情况,也是唯一一种(我能想到)导致operator<<
打印的情况除了操作数的值之外的其他东西。其原因可以追溯到C ++的C语言,它没有“字符串”类型,并通过char*
指针操作字符串。
operator<<
有许多其他重载,适用于std::string
的各种整数和浮点数值类型,等等。
答案 2 :(得分:9)
您应该将代码更改为:
cout << static_cast<const void*>(terry);
问题是<<
运算符被重载以指向C样式字符串以打印字符串的内容。如果你把它转换为原始指针,你将拥有使用iostreams打印指针的默认行为。
答案 3 :(得分:1)
cout被重载,因此当你给它一个char *时,它将打印为指向C样式字符串的指针。因此,它打印出字符,直到它遇到空终止字符。
如果你使用printf而不是cout,你会看到地址。你也可以将指针转换为另一种类型,比如说(void *),你也可以获得地址。
答案 4 :(得分:1)
std::cout
被定义为std::ostream
,其中this的定义是operator<<
。
值得注意的是这一行:
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const char* s );
当您使用<<
类型为char*
的参数时,将选择此选项。
任何其他非char指针类型都为here:
basic_ostream& operator<<( const void* value );
此操作继续进行std::num_put
,该操作用于格式化数值。因此,在C格式化函数中,指针的数字解释方式类似于%p
。
答案 5 :(得分:-1)
“hello”是一个字符串,即char数组。 const char*
是指向此数组的指针,因此当您取消引用此指针时,您将获得第一个元素的值。
就像你有
一样int a[] = {1, 2, 3};
int *b = a;
cout << *b << endl;
你刚刚打印1
。