#include <iostream>
using namespace std;
int main()
{
char *pc;
int *pi;
double *pd;
pc = (char *)10000;
pi = (int *)10000;
pd = (double *)10000;
// 1)
cout << "before pc = " << (void *)pc << " pi = " << pi << " pd = " << pd << endl;
pc++;
pi++;
pd++;
// 2)
cout << "after increase pc = " << (void *)pc << " pi = " << pi << " pd = " << pd << endl;
return 0;
}
在这段代码(1,2)中,为什么变量pc
被转换为void指针?
我正在检查如果不打印变量pc
,则不会发生运行时错误。
答案 0 :(得分:77)
因为char*
使用cout << something
打印时会尝试打印字符串(cout << "Hello, World" << endl;
使用char *
[迂腐地,在此示例中为const char *
]代表"Hello, World"
)。
由于您不想在地址10000处打印字符串(它会发生最糟糕的崩溃),因此代码需要做一些事情以避免将指针用作字符串。
因此,通过强制转换为void*
,您将获得打印的实际地址,这通常是指针类型的默认值,除了char *
。
答案 1 :(得分:38)
因为否则,将调用重载的operator << (std::ostream&, const char*)
,它不会打印地址,而是打印C字符串。
例如:
std::cout << "Boo!";
打印Boo!
,而
std::cout << (void*)"Boo!";
打印字符串文字所在的地址。