为什么在打印字符类型指针时,C++会显示字符?

6
请参考下面的代码:

考虑以下代码:

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 指针的情况下它不显示地址,而对于整数指针它会显示呢?

你在另一台电脑上尝试过这段代码吗? - nj-ath
printf("%p\n", p_a); - someuser
是的,我已经检查过了。那里显示的符号是相同的。 - Failed Scientist
1
你需要使用 cout<<"Value of &char_a is (p_a) :"<< reinterpret_cast<void *>(p_a) <<endl; (你也可以使用 static_cast - Mohit Jain
3个回答

14

将字符指针作为参数传递被解释为一个以NULL结尾的C字符串,因为非成员std::ostream<<(ostream&)过载具有接受以NULL结尾的C字符串(const char *)的重载。

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

就像您的情况一样,这只是一个字符,后续的内存位置都是垃圾值,ostream会读取该内存直到在内存流中遇到NULL为止。

这绝对是未定义的行为,因为您将访问超出分配给进程的内存。

如果您确实需要传递字符指针并显示地址,您可以利用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;

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 是以空字符结尾的字符串,但由于不是,因此您看到了垃圾数据。

3

std::ostream的运算符<<被重载了,以处理char *类型(将其视为字符串)。如果您想打印地址,请将其转换为(void *)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接