形態
volatile int* p;
のポインタは、コンパイラがvolatile
として扱うint
へのポインタです。つまり、コンパイラは、p
が指し示す変数が、ソースコードに何もない場合でも変更があったとしても、これが発生する可能性があると想定することを意味します。たとえば、p
を通常の整数に設定すると、*p
を読み書きするたびに、値が予期せず変更された可能性があることがコンパイラによって認識されます。
volatile int*
のための1つ以上のユースケースがあります:あなたはvolatile
としてint
を宣言する場合は、通常のint*
でそれを指してはいけません。たとえば、これは悪い考えです:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
この理由は、Cコンパイラは、もはや変数がptr
がvolatile
あるが指すことを覚えて、それが間違ってレジスタに*p
の値をキャッシュするかもしれないということではありません。実際、C++では、上記のコードはエラーです。代わりに、あなたは
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
さて、コンパイラはvolatile int
でptr
そのポイントを覚えているので、それはないでしょう書くべき(またはすべきでない!)を最適化しよう*ptr
を通じてアクセスします。
最後の詳細 - あなたが議論したポインタはvolatile int
へのポインタです。あなたもこれを行うことができます。
int* volatile ptr;
をこれは、ポインタ自体ポインタ自体は、コンパイラは、メモリ内のポインタをキャッシュするか、ポインタ値を最適化しようと試みるべきではないことを意味し、volatile
であると述べています
volatile int* volatile ptr;
これは、ポインタと指示先の両方が予期せず変更を取得できることを述べている:あなたはこの獣を取得したい場合あなたが一緒にこれらを組み合わせることができます何か他のもの(ハードウェア、別のスレッドなど)によって再割り当てされる可能性があります。コンパイラはポインタ自体を最適化することはできず、指されているものを最適化することはできません。
希望すると便利です。
私はあなたが "あなたはそれを定期的なint *で指してはいけない"と思うと思います。 – markgz
@ markgz-おっと!それは正解です。一定。 – templatetypedef
私はC言語でもエラーだと思いますが、Cコンパイラは型の不一致について不平を言うことは少なくありません。 –