Я смущен тем, что спецификация ANSI говорит об изменении переменной, объявленной const
, которая может быть законно изменена через ее адрес. К сожалению, у меня нет доступа к спецификации C90, но я получил противоречивые указатели:
Ключевое слово const не превращает переменную в константу! Символ с квалификатором const просто означает, что этот символ нельзя использовать для присваивания. Это делает значение читаемым только через этот символ; это не предотвращает изменение значения другими средствами, внутренними (или даже внешними) по отношению к программе. Это довольно полезно только для уточнения параметра указателя, чтобы указать, что эта функция не будет изменять данные, на которые указывает аргумент, но другие функции могут. (Эксперт по программированию на C: секреты Deep C: Питер ван дер Линден)
Если предпринимается попытка изменить объект, определенный с типом, уточненным константой, путем использования lvalue с типом, не уточненным константой, поведение не определено. Если предпринимается попытка сослаться на объект, определенный с типом с уточнением volatile, посредством использования lvalue с типом с уточнением volatile, поведение не определено. (http://flash-gordon.me.uk/ansi.c.txt)
Последнее я видел в спецификации C99 (n1256.pdf).
Кто-нибудь может пояснить, какое из двух приведенных выше мнений верно?
Редактировать: Программирование Expect C фактически дает пример, демонстрирующий возможность изменения переменной const
с помощью указателя.