Прежде всего, это:
char ** ptr2 = (char**)ptr;
Не присваивает адрес ptr
ptr2
. Он присваивает адрес str
(содержится в ptr
) ptr2
и делает вид, что его char**
вместо char*
, что может привести к катастрофическим результатам позже, когда вы попытаетесь его использовать. Вы, вероятно, имели в виду:
char ** ptr2 = &ptr;
Поскольку &ptr
(адрес) действительно постоянен, в отличие от ptr
(значение), он должен компилироваться без ошибок. Кроме того, это то, что вы действительно хотите в любом случае.