为什么要在此代码中使用void指针?

时间:2014-09-22 08:01:27

标签: c++

#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,则不会发生运行时错误。

2 个答案:

答案 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!";

打印字符串文字所在的地址。