形式的指针
volatile int* p;
是指向的指针int
,编译器将其视为volatile
。这意味着编译器将假定p
所指向的变量可能已更改,即使源代码中没有任何内容暗示可能发生这种情况。例如,如果我设置p
为指向正整数,则每次读写时*p
编译器都知道该值可能已意外更改。
还有一种用例volatile int*
:如果声明一个int
as volatile
,则不应以常规指向它int*
。例如,这是一个坏主意:
volatile int myVolatileInt;
int* ptr = &myVolatileInt;
这样做的原因是C编译器不再记住由指向的变量ptr
is volatile
,因此它可能会*p
错误地在寄存器中缓存值。实际上,在C ++中,以上代码是错误的。相反,您应该写
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt;
现在,编译器会记住ptr
指向a的位置volatile int
,因此它不会(或不应该!)尝试通过优化访问*ptr
。
最后一个细节-您讨论的指针是的指针volatile int
。您也可以这样做:
int* volatile ptr;
这表示指针本身是volatile
,这意味着编译器不应尝试将指针缓存在内存中或尝试优化指针值,因为指针本身可能会被其他东西(硬件等)重新分配。如果你想得到这只野兽,那就在一起:
volatile int* volatile ptr;
这表示指针和指针都可能会意外更改。编译器无法优化指针本身,也无法优化所指向的内容。
希望这可以帮助!