关于C中volatile关键字的解释

c9qzyr3d  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(164)

有人能给予我解释一下这行中第二个volatile关键字的用法吗

  1. volatile unsigned int * volatile buffer;

我知道volatile关键字通常用于向编译器指示变量的值可以随时更改,而编译器在附近找到的代码不会采取任何行动。这可以防止编译器过度优化或缓存变量,确保始终从内存而不是从缓存的值访问变量。但是第二个呢?
谢谢大家的帮助

luaexgnf

luaexgnf1#

volatile unsigned int * volatile buffer;
它的意思是:“volatile pointer to volatile unsigned int
指针和引用对象都是volatile

  1. volatile unsigned int * volatile buffer;
  2. ^^^ ^^^
  3. ^^^ ^^^-volatile pointer
  4. ^^^
  5. ^^^-volatile unsigned int
oxcyiej7

oxcyiej72#

  1. volatile int * x;

指针指向某个可以随时更改的整数,可以随时读取等等。
然而,指针本身(这意味着:变量x)只有在程序赋值时才改变(它不是volatile)。

  1. int * volatile y;

变量y(这意味着:指针本身)可以随时改变。
但是,它指向一个整数值,只有当程序赋值时该整数值才会改变。

  1. volatile int * volatile z;

变量z可以随时改变。它所指向的整数也可能随时发生变化。
有了更多的间接级别,就有了更多的组合:

  1. int * * volatile w1;
  2. volatile int * * w2;
  3. volatile int * * volatile w3;
  4. volatile int * volatile * w4;
  5. ...

同样的原则也适用于const

  1. const int * a;
  2. int * const b;
  3. const int * const c;
展开查看全部
cgfeq70w

cgfeq70w3#

... *volatile表示指针变量本身是volatile的。这不是你通常需要使用的东西,因为编译器已经应该禁用对该指针变量的优化,因为它指向volatile数据。
从理论上讲,如果指针是一个硬件地址寄存器,那么使指针本身成为volatile可能是有意义的。我不记得我曾经见过它使用,即使在低级别的嵌入式系统代码。
void func (volatile const int* n volatile const)这样带有过多限定符垃圾的代码通常只是一个指示器,表明程序员不太知道他们在做什么,或者他们喜欢“摆出”大多无用的语言特性的知识。...* const有很多用途,但那是另一个故事了。

相关问题