cout<< with char *参数打印字符串,而不是指针值

时间:2013-07-23 14:41:38

标签: c++

此:

const char * terry = "hello";
cout<<terry;

打印hello而不是'h'的内存地址。为什么会这样?

6 个答案:

答案 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