Указатель - хранитель адреса области памяти. Размер адреса для всех объектов одинаков. Т.е. sizeof(int*)=sizeof(char*)=sizeof(указатель на любой объект). Поэтому и существует void*. При этом, его нельзя разыменовать, потому что что дальше с ним делать? Какой это тип? Как с ним обращаться? Вообще, void* - это наследие C. Потому что malloc абсолютно плевать, для чего тебе нужна область в памяти, он выделяет и возвращает тебе безликий указатель (void*). А дальше решай сам, приводи сам к нужному типу