2008-10-24 5 views
5

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

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

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

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

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

+0

Если вы собираетесь редактировать грамматику и орфографию, почему бы не напечатать «If» с «я», а не «!»? – Eclipse 2008-10-24 06:20:53

ответ

34

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;

Это же, как и первой декларации.

+0

Вы уверены, что волатильность гарантирует, что значение, доступное только для чтения, отражает изменения, сделанные в другом потоке? На каких реализациях? Что относительно многоядерных архитектур с некогерентными кэшами? – 2008-10-24 08:51:40

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^