В чем разница между этими объявлениями в C? - PullRequest
5 голосов
/ 24 октября 2008

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

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

Являются ли какие-либо из вышеуказанных деклараций неправильными?

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

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

Ответы [ 2 ]

34 голосов
/ 24 октября 2008

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;

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

4 голосов
/ 24 октября 2008

Вы читаете объявления переменных в C / 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

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

...