请考虑以下代码:
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;
当我运行它时,输出为:
那么为什么不在char指针的情况下显示地址,就像它对整数的指针一样?
答案 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 *)
。