volatile unsigned int * const

时间:2012-03-16 08:59:14

标签: c

在以下代码行中,const关键字的目的是什么?

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

我理解volatile unsigned int *位,但为什么const在那里?

3 个答案:

答案 0 :(得分:13)

constvolatile被称为“类型限定符”。他们的语法是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,这是等价的。

让我们说我们希望指针本身也是常量。出于某种原因,我们希望阻止程序员更改指向的地址。例如,指针可能存储在嵌入式系统的只读存储器中。指向数据的常量指针在*之后用const关键字声明为int*const x;。在这种情况下,指向类型是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

在上面的例子中,我使用了类型限定符const。但是volatile也是一个类型限定符,它的行为方式完全相同!可以声明非易失性指针到易失性数据等。

最后,可以组合不同的类型限定符。例如,volatile const int*是指向易失性const数据的非常量非易失性指针。我们再一次有一个很好的选择来混合这些的顺序混淆,所以我们也可以写volatile int const *int volatile const *等等,这一切都意味着相同。

答案 1 :(得分:6)

我理解volatile unsigned int *位,但为什么const在那里?

这意味着指针是常量,这意味着指针不能(而不应该)指向任何其他地址。

请注意以下构造:

volatile unsigned int * const UART0DR = 

指针在这里是不变的。


volatile unsigned int const * UART0DR = 

这里指向的地址是不变的。


volatile unsigned int const * const UART0DR = 

在这种情况下,指向的地址和指针是常量。

答案 2 :(得分:2)

来自http://cdecl.org

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