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;
Это то же самое, что и первое объявление.