const int * i;
i
представляет собой указатель на постоянное число. i
можно изменить, чтобы указать другое значение, но значение, на которое указывает i
, изменить нельзя.
int * const i;
i
является постоянным указателем на непостоянной целое число. Значение, на которое указывает i
, может быть изменено, но i
не может быть изменено, чтобы указать на другое значение.
const volatile int ip;
Это один вид сложнее. Тот факт, что ip
равен const
, означает, что компилятор не позволит вам изменить значение ip
. Однако он все еще может быть модифицирован в теории, например. используя свой адрес и используя оператор const_cast
. Это очень опасно и не очень хорошая идея, но это разрешено. Квалификатор volatile
указывает, что в любое время ip
обращается к нему, его всегда следует перезагружать из памяти, то есть его НЕ следует кэшировать в регистре. Это не позволяет компилятору совершить определенные оптимизации. Вы хотите использовать квалификатор volatile
, если у вас есть переменная, которая может быть изменена другим потоком, или если вы используете операции ввода/вывода с отображением памяти или другие подобные ситуации, которые могут вызывать поведение, которое компилятор может не ожидать. Использование const
и volatile
по той же переменной довольно необычно (но легально) - вы обычно видите одно, а не другое.
const int *i;
Это же, как и первой декларации.
Если вы собираетесь редактировать грамматику и орфографию, почему бы не напечатать «If» с «я», а не «!»? – Eclipse 2008-10-24 06:20:53