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