指向易失性字符的易失性指针。额外的静态关键字

volatile pointer to volatile char. additional static keyword

我对 C 语法有一个小问题。 我知道写作

volatile char * volatile foo;

创建指向易失字符的易失指针变量。

在我的理解中,第一个 volatile 意味着指针指向一个 volatile 元素,因为 "volatile char" 部分。 第二个volatile表示指针"foo"本身是volatile.

这个假设是否正确?

什么会

static volatile char * volatile bar;

做吗?

假设上面的陈述是正确的,它应该声明一个指向 volatile+static char 的 volatile 指针。我的问题是,指针知道目标变量是否为静态无关紧要。所以这可能声明了一个指向 volatile char 的 static+volatile 指针。

但是,假设这是正确的,第一个 volatile 将引用指针,第二个引用指向的数据。

哪个假设是正确的? 每个 volatile 有什么作用?

谢谢

So this probably declares a static+volatile pointer to a volatile char

当然可以。

However, assumed this is correct the first volatile would be referring to the pointer and the second one to the data pointed at

没有。 static 只是意味着 bar 是静态的。它与挥发性无关。因此,例如,static char * volatile bar 是 volatile 静态指针,而 static volatile char *bar 是指向 volatile char 的静态指针。

In my understanding the first volatile means that the pointer points to a volatile element because of the part "volatile char". The second volatile means that the pointer "foo" itself is volatile. Is this assumption correct?

是的。 类型限定符 (volatile and/or const and/or restrict) * 指的是指向的类型,而右侧的每个类型限定符指的是指针类型本身。这仅适用于类型限定符。

static(以及 extern、auto 等)是 storage-class 说明符 ,它们仅与可变持续时间和范围有关。它们总是引用声明的变量类型本身,在本例中是指针。为指向的数据声明一个 storage-class 说明符是没有意义的,因为该数据不是在这一行声明的,而是在其他某行声明的。

另请注意,您始终可以使用比指向类型更多的类型限定符来声明指针变量,但绝不能更少。在实施 const 正确性.

时了解这一点很重要