Вопрос спрашивает почему. Вот почему:
Это разрешено, потому что если у вас есть указатель на адрес памяти, язык не знает, на что он указывает. Это может быть переменная, часть структуры, куча или стек, или что угодно. Поэтому он не может помешать вам писать на него. Прямой доступ к памяти всегда небезопасен, и его следует избегать, если есть другой способ сделать это.
const
останавливает изменение значения const
с присваиванием (или приращением и т. д.). Этот тип мутации — единственные операции, которые он может гарантировать, что вы не сможете выполнять над константой.
Другой способ взглянуть на это — разделение статического контекста (т. е. во время компиляции) и контекста времени выполнения. Когда вы компилируете фрагмент кода, который может, например, присваивать значение переменной, язык может сказать «это недопустимо, это константа», и это ошибка компиляции. После этого код компилируется в исполняемый файл, и тот факт, что это const
, теряется. Объявления переменных (и остальная часть языка) записываются как входные данные для компилятора. После того, как он скомпилирован, код не имеет значения. Вы можете сделать логическое доказательство в своем компиляторе, чтобы сказать, что const
s не изменились. Скомпилированная программа запускается, и во время компиляции мы знаем, что создали программу, не нарушающую правил.
Когда вы вводите указатели, у вас есть поведение, которое можно определить во время выполнения. Код, который вы написали, теперь неактуален, и вы можете [попытаться] делать то, что хотите. Тот факт, что указатели типизированы (позволяет выполнять арифметические операции с указателями, интерпретируя память в конце указателя как определенный тип), означает, что язык дает вам некоторую помощь, но не может помешать вам что-либо делать. Это не может дать никаких гарантий, так как вы можете указать указатель куда угодно. Компилятор не может помешать вам нарушить правила во время выполнения кода, использующего указатели.
Тем не менее, указатели — это то, как мы получаем динамическое поведение и структуры данных, и они необходимы для всего, кроме самого тривиального кода.
(Вышеизложенное подлежит множеству предостережений, т.е. эвристика кода, более сложная шина статического анализа в целом верна для ванильного компилятора.)
person
Joe
schedule
20.03.2013