Несмотря на то, что int и char являются совместимыми типами и могут быть неявно преобразованы из int в char, и наоборот, указатели не имеют никакого неявного преобразования, даже если они хранятся в типах.Рассмотрим:
//int* c = &b; //doesn't work, because &b is char *
//char* d = &a; // doesn't work, a is int *
int* c = (int*)& b; //compiled
char* d = (char*)& d; //compiled
cout << *c << " " << *d << endl;
К сожалению, явное C-преобразование вызывает неопределенное поведение в этих указателях, поэтому мы получаем нежелательный вывод: 9-858993567 B
C ++ преобразование более надежно в этом случае, поэтомуstatic_cast вместо C-преобразования вызывает ошибку компиляции
int * c = static_cast<int*>(&a); // error, invalid type conversion
char * d = static_cast<char*>(&b); // error, invalid type conversion
Только reinterpret_cast позволяет вам делать такие вещи.Таким образом, вы не можете хранить в указателе значение, тип которого не является типом указателя.