volatile unsigned int * const

В следующей строке кода, какова цель ключевых слов const ?

 volatile unsigned int * const UART0DR = (unsigned int *)0x10009000; 

Я понимаю volatile unsigned int * бит, но почему там const ?

const и volatile называются «classификаторами типов». Их синтаксис является одной из самых запутанных вещей в C.

Прежде всего, мы имеем дело с обычной переменной. Обычно вы указываете спецификатор типа перед именем переменной: const int x; , но также прекрасно писать его после имени переменной: int const x; , Смысл один и тот же, последний синтаксис просто путается.

При объявлении указателя вы имеете дело с двумя типами: типом самого указателя и типом, на который указывает. С обычными указателями это тривиально: int* x означает, что тип указателя является указателем на int, а указательный тип – int.

Если указательный тип – const int, указатель объявляется как const int* x . Указатель имеет тип pointer-to-const-int, а указательный тип – const int. Если вы хотите смутить всех, вы также можете написать int const* x , это эквивалентно.

Скажем, мы хотим, чтобы и сам указатель был постоянным. По какой-то причине мы хотим заблокировать программиста от изменения указанного адреса. Например, возможно, указатель должен храниться в постоянной памяти встроенной системы. Постоянный указатель на данные, объявляется как int*const x; с ключевым словом const после *. Указанный тип в этом случае является int , а не const int . (Я пытаюсь написать const вместе с *, без пробела между ними, чтобы подчеркнуть, что указатель является постоянным)

Если мы хотим, чтобы указательный тип тоже был постоянным, нам пришлось бы объединить два указанных выше объявления: const int*const x; означает постоянный указатель, указывающий на константу int.

 const int x; // x is a constant data variable int const x; // x is a constant data variable const int* x; // x is a non-constant pointer to constant data int const* x; // x is a non-constant pointer to constant data int*const x; // x is a constant pointer to non-constant data const int*const x; // x is a constant pointer to constant data 

В приведенных выше примерах я использовал classификатор типа const . Но volatile также является classификатором типов, и он ведет себя точно так же! Можно объявить энергонезависимые указатели на летучие данные и т. Д.

И, наконец, можно комбинировать различные classификаторы типов. Например, volatile const int* является непостоянным, энергонезависимым указателем на данные volatile const. Еще раз у нас есть замечательная возможность смешать их порядок, чтобы смутить, поэтому мы также можем написать volatile int const * или int volatile const * т. Д., И все это означает то же самое.

Я понимаю volatile unsigned int * бит, но почему там const ?

Это означает, что указатель является постоянным, что означает, что указатель не может (а не должен) указывать на любой другой адрес.

Обратите внимание на следующие конструкции:

 volatile unsigned int * const UART0DR = 

Указатель здесь постоянный.


 volatile unsigned int const * UART0DR = 

Указанный адрес здесь постоянный.


 volatile unsigned int const * const UART0DR = 

Указанный адрес, а также указатель в этом случае постоянны.

С http://cdecl.org

 volatile unsigned int *const a => declare a as const pointer to volatile unsigned int