この声明を理解するのを手伝ってください:
static int ** volatile ptr
このポインターステートメントを分析する方法を教えてください。
static
これは静的変数であることを意味します-関数内のローカル変数のソースコード内のコピーは1つだけであり、グローバルのモジュール間で共有されません。
int **ptr
は、ptr が へのポインタへのポインタであることを意味しますint
。
volatile
の右側にある*
ということは、ポインター自体が揮発性であり、ポイントされた値ではないことを意味します。volatile は、この変数へのすべてのアクセスが実際のメモリ操作である必要があり、ほとんどの最適化が許可されないことを意味します。
マーカーを挿入した後にタイトル テキストに対処するには: 4(static int 3( * 2( * 1(volatile ptr)))。
1: プログラムが認識できない理由で、実行時に自由に変更できる変数。一般的な原因は、他のスレッド、シグナルまたは他のイベント、および実際にはハードウェア コントローラーである「メモリ」へのポインターなどです。このような変更で失敗する可能性があるコードをコンパイラー/オプティマイザーが発行するのを停止します。
2: このメモリへの揮発性ポインタ。指されているものは揮発性ではありません。
3: ポインターへのポインター、またはポインターの配列。char **argv; を考えてみてください。繰り返しますが、揮発性ではありません。
4: 静的: これは、宣言のどこにあるかによって異なります。
興味深い: const volatile は、外部の影響によってポインターが変更される可能性があることを示しますが、ソフトウェアでは変更できません。