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

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

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

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

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

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

2 ответа

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;

Это то же самое, что и первая декларация.

Вы читаете объявления переменных в 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++ или наполовину приличный ресурс будут иметь объяснения каждого.

Другие вопросы по тегам