const
не меняет представление типа, в частности, представление T*
точно такое же, как T const*
.
Рассмотрим:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
Представление cpi
одновременно представляет int*
и int const*
через *pcpci
.
Невозможно изменить представление cpi
при инициализации pcpci
.
Конечно, если у объектов-указателей есть не значащие биты, компилятор может их случайным образом переворачивать; в частности, const_cast
может перевернуть незначащие биты указателя, но любое неявное преобразование также может. Я не думаю, что этот случай существует в реальном мире.
То же самое применяется, когда две разные битовые комбинации приводят к одному и тому же значению адреса (база + смещение, когда смещение достаточно велико).