在以下代码行中,const
关键字的目的是什么?
volatile unsigned int * const UART0DR = (unsigned int *)0x10009000;
我理解volatile unsigned int *
位,但为什么const
在那里?
答案 0 :(得分:13)
const
和volatile
被称为“类型限定符”。他们的语法是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)
volatile unsigned int *const a
=>
declare a as const pointer to volatile unsigned int