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