CおよびC++では、次の宣言は何をしますか?
const int * i;
int * const i;
const volatile int ip;
const int *i;
上記の宣言のいずれかが間違っていますか?
そうでない場合、それらの意味と違いは何ですか?
上記の宣言の有用な使用法は何ですか(つまり、C / C ++ /埋め込みCでそれらを使用する必要がある状況で)?
CおよびC++では、次の宣言は何をしますか?
const int * i;
int * const i;
const volatile int ip;
const int *i;
上記の宣言のいずれかが間違っていますか?
そうでない場合、それらの意味と違いは何ですか?
上記の宣言の有用な使用法は何ですか(つまり、C / C ++ /埋め込みCでそれらを使用する必要がある状況で)?
const int * i;
i
定数整数へのポインタです。 i
別の値を指すように変更することはできますが、が指す値をi
変更することはできません。
int * const i;
i
非定数整数への定数ポインタです。が指す値はi
変更できますがi
、別の値を指すように変更することはできません。
const volatile int ip;
これはちょっとトリッキーです。これは、コンパイラが。の値を変更できないことを意味しip
ます。ただし、理論的には、たとえばアドレスを取得して演算子を使用することにより、変更することもできます。これは非常に危険であり、良い考えではありませんが、許可されています。修飾子は、アクセスされるたびに、常にメモリからリロードする必要があることを示します。つまり、レジスタにキャッシュしないでください。これにより、コンパイラが特定の最適化を行うことができなくなります。別のスレッドによって変更される可能性のある変数がある場合、メモリマップドI / Oを使用している場合、またはコンパイラが予期しない動作を引き起こす可能性のあるその他の同様の状況で、修飾子を使用する必要があります。およびの使用const
ip
const_cast
volatile
ip
volatile
const
volatile
同じ変数での使用はかなり珍しいです(ただし合法です)。通常、一方は表示されますが、もう一方は表示されません。
const int *i;
これは最初の宣言と同じです。
変数宣言は、いわば右から左にC /C++で読みます。
const int *i; // pointer to a constant int (the integer value doesn't change)
int *const i; // constant pointer to an int (what i points to doesn't change)
const volatile int ip; // a constant integer whose value will never be cached by the system
それぞれに目的があります。C ++の教科書や半ばまともなリソースには、それぞれの説明があります。