c中volatile和指针变量之间的区别

时间:2010-12-03 06:26:41

标签: c

volatile和pointer变量都从地址中获取值而不是优化,因此有什么明显区别。

4 个答案:

答案 0 :(得分:6)

volatile是一个存储类,还有registerstaticexternalvolatile表示除了正在运行的程序之外,其他力可以改变volatile变量的值,因此编译器必须小心不要在每次使用时优化获取变量的新副本。

指针包含内存位置的地址。要访问它指向的内容,必须取消引用它。

答案 1 :(得分:0)

Volatile指示编译器从存储器位置重新获取值,而不是使用存储在寄存器中的值。这是因为存储器位置可能已被更新(例如,通过其他线程)。这就是

的含义
  

从地址

中获取值

不作为指针。你也可以使用一个非指针变量,例如原始。
因此,重新获取int变量,而不是在寄存器中使用存储的值 它还强制执行某些与读/写相关的语义(但这与您的OP无关)

答案 2 :(得分:0)

Volatile是一个存储类,它告诉编译器每次访问时都从内存中获取值,并在每次写入时写入内存。当程序以外的某些实体也可能更改某个地址的值时,通常会使用它。

编译器以多种方式优化程序。例如,如果您有以下代码:

int *ptr=0x12345678;
int a;
*ptr=0x10;
a=*ptr;

然后编译器可以将语句a=*ptr;优化为a=0x10;以避免内存访问。理由是因为你刚写了0x10; to * ptr所以当你读* ptr时你会得到0x10。

在正常情况下,这种假设是正确的,但考虑到地址0x12345678是嵌入式系统UART的某个存储器映射寄存器的地址并向其写入0x10告诉它从连接的控制台读取字符的情况。然后将读取的字符写回地址0x12345678,以便用户可以从那里获取它。现在在这种情况下,上述优化将导致问题。因此,您需要告诉编译器每次访问时都要读取/写入指针的值,而不是优化对它的访问。所以你声明指针ptr volatile告诉编译器不要优化对它的访问。

volatile int *ptr=0x12345678;

答案 3 :(得分:0)

Volatile:一个类型说明符,它告诉编译器从它的内存位置访问变量(即使程序没有改变值,也不要放入寄存器以便快速访问),因为一个 volatile 变量的值是可以改变的从程序外部(例如微控制器中的 IO 端口)或从 ISR。

指针:指针变量用于保存变量的地址。

易失性指针:告诉编译器仅从其位置读取指针指向的值(例如微控制器中的 GPIO 指针)。