Подтвердить что ты не робот

Почему вы используете указатель void в этом коде?

#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.

4b9b3361

Ответ 1

Поскольку char* при печати с помощью cout << something будет пытаться напечатать строку (cout << "Hello, World" << endl; использует char * [педантично, в этом примере, const char *], чтобы представить "Hello, World").

Так как вы не хотите печатать строку по адресу 10000 (это может привести к сбою), код должен сделать что-то, чтобы избежать использования указателя в виде строки.

Таким образом, выбрав void*, вы получите фактический адрес, который по умолчанию используется для типов указателей, EXCEPT char *.

Ответ 2

Потому что в противном случае вызывается перегруженный operator << (std::ostream&, const char*), который не печатает адрес, а C-строку.

Например:

std::cout << "Boo!"; 

выводит Boo!, тогда как

std::cout << (void*)"Boo!";

печатает адрес, в котором находится строковый литерал.