Почему вы используете указатель 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
.
Ответы
Ответ 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!";
печатает адрес, в котором находится строковый литерал.