当我们将指针打印到字符类型时,为什么C ++会显示字符?

时间:2014-09-12 05:16:49

标签: c++ pointers

请考虑以下代码:

char char_a = 'A';
int int_b = 34;

char* p_a = &char_a;
int* p_b = &int_b;

cout<<"Value of int_b is (*p_b) :"<< *p_b<<endl;
cout<<"Value of &int_b is (p_b) :"<< p_b<<endl;

cout<<"Value of char_a is (*p_a) :"<< *p_a<<endl;
cout<<"Value of &char_a is (p_a) :"<< p_a<<endl;

当我运行它时,输出为:

enter image description here

那么为什么不在char指针的情况下显示地址,就像它对整数的指针一样?

3 个答案:

答案 0 :(得分:14)

将指针传递给字符被解释为NULL终止的C字符串,因为非成员std :: ostream&lt;&lt;(ostream&amp;)重载具有NULL终止的C字符串(const char *)的重载。

template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, 
                                         const char* s );

在你的情况下,它只是一个字符,后续的内存位置是垃圾,ostream读取内存,直到它在内存流中遇到NULL。

这肯定是一种未定义的行为,因为您将访问已分配给您的进程的内存之外的内存。

如果您确实需要传递字符指针并显示地址,则可以利用格式化的插入器operator<<成员重载来实现void *

basic_ostream& operator<<( const void* value ); 

要访问此内容,您需要从char *投射到const void *

的明确指针
std::cout << "Value of &char_a is (p_a) :" << static_cast<const void *>(p_a) << std::endl;

答案 1 :(得分:3)

说你有:

char s[] = "abcd";
char* cp = a;
cout << cp << endl;

期望你想看到:

abcd

在输出中。

std::ostream有一个与char const*一起使用的重载,负责在上面的代码中打印abcd,而不仅仅是cp的指针值。

致电时

cout<<"Value of &char_a is (p_a) :"<< p_a<<endl;

程序希望p_a为空终止字符串。既然不是,你就会看到垃圾。

答案 2 :(得分:3)

运营商&lt;&lt; for std::ostream重载char *(将其作为字符串处理)。如果您要打印地址,请将其转换为(void *)