Вопрос предполагает, что, учитывая const int *a
, int *i = a;
может быть разрешено, а последующее *i = 0;
будет запрещено («незаконно»).
Это неосуществимо, поскольку требует, чтобы компилятор отслеживал информацию об источнике данных в i
. В точке, где появляется *i = 0;
, компилятор должен знать, что i
содержит значение, полученное в результате инициализации из a
.
Мы могли бы сделать это очень простым кодом. Но учтите, что код может быть очень сложным, с циклами, ветвями и вызовами функций. В момент появления *i = 0;
компилятор, как правило, не может знать, содержит ли i
адрес из a
или он был изменен на что-то другое. (Я ожидаю, что это эквивалентно проблеме остановки и, следовательно, вообще логически невозможно).
C использует типы для управления этим. Когда a
является указателем на const
, он может быть назначен только указателю на const
(если не переопределено явным приведением). Поэтому i
должен быть указателем на const
, что позволяет компилятору знать, что объект, на который он указывает, не должен изменяться.