const int * a;
Прочитайте декларацию справа налево. [См. Примечание] Что вы получаете? a
- это *
, то есть указатель на int
, то есть целое число const
, то есть константа. Короче говоря, переменная a
указывает на целое число, значение которого вы не можете изменить. По крайней мере, не через a
. Является ли pointee действительно неизменным или нет, это другой вопрос. Но факт остается фактом, вы не можете использовать a
для изменения *a
;
const
- это обещание, которое вы даете себе: я никогда не буду пытаться изменить pointee, используя указатель на const. Компилятор только дает вам поддержку.
Если вы действительно хотите написать в адрес пуанте, вам нужен неконстантный указатель, например:
int *a;
*a = 42; /* this is fine */
И очень хороший комментарий от bortzmeyer : (Я думал, что пропущу это, чтобы упростить его:)
Вы также можете поставить const
после *
(как вы сказали, объявления должны читаться справа налево).
Что он имеет в виду, это:
const int *a;
ничем не отличается от
int const *a;
(Помните, правило чтения справа налево?)
Но сильно отличается от:
int * const p;
Прочтите его, и мы получим: p
- это const
(- муравей) *
(указатель) на int
(- эгер). Переведено: как только вы установите p
для указания на целое число, вы не сможете переустановить его (т.е. записать в него, чтобы оно указывало на другое целое число - точку установления константы p
), но вы можете написать в адрес получателя много (значение не постоянное).
Примечание: Для педантично наклонных здесь есть «Правило» от Даррон :
«объявления должны читаться справа налево» - это упрощение - если есть круглые скобки, их следует читать изнутри. Если в скобках не указан вызов функции. Настоящее правило - «относись к нему как к выражению; если я применю эти операторы, я в итоге получу этот простой тип».
В этом ответе действительно было бы гораздо меньше мяса, кроме bortzmeyer и Darron - спасибо!
PPS: (Я обещаю, что это будет последнее редактирование. Что ж, надеюсь!)
void main()
не является стандартной подписью для main в C или C ++. Не используйте его, пока не узнаете себя или (что более важно), чтобы ваш код никогда не совершал путешествие в другую вселенную.