В чем разница между этими объявлениями в C?

В C и С++ что делают следующие объявления?

const int * i;
int * const i;
const volatile int ip;
const int *i;

Ошибочны ли какие-либо из указанных выше заявлений?

Если нет, то в чем смысл и различия между ними?

Какое полезное использование вышеуказанных объявлений (я имею в виду, в какой ситуации мы должны использовать их в C/С++/embedded C)?

Ответ 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;

Это то же самое, что и первое объявление.

Ответ 2

Вы читаете объявления переменных в C/С++ справа налево, так сказать.

const int *i;  // pointer to a constant int (the integer value doesn't change)

int *const i;  // constant pointer to an int (what i points to doesn't change)

const volatile int ip;  // a constant integer whose value will never be cached by the system

У каждого из них свои цели. Любой учебник на С++ или наполовину достойный ресурс будет иметь объяснения каждого из них.