Cでは、静的なキーワードはまた、機能を変更するために使用できる変数を変更するために使用することはできません。staticキーワードを使用して変数を変更する場合、我々は静的変数としてこの変数を呼び出します。
ストレージ静的変数とグローバル変数は静的記憶されています。静的変数は静的記憶されているが、ここでは特別な注意が必要で、静的変数ストレージは、必ずしも静的変数ではありません。例えば、静的ストレージモードのであるが、グローバル変数の後、それは静的変数ではない、静的なグローバル変数になることによって、静的に定義されなければなりません。
隠されたと孤立の役割
グローバル変数は静的記憶が、静的でない変数されているかのように、すでに、前に説明しました。グローバル変数の全体の範囲は、ソースファイルの複数のソース、ソースプログラムで、各ソース・ファイル内のグローバル変数は有効です。
私たちは、ソース・ファイル内のグローバル変数の使用に限定したい場合は、ファイルが他のソースで参照することはできません、それはソースファイル内でのみ変数の定義でその範囲を限定することで有効ですが、ない同じソース内の他のソースファイルで使用しています。このとき、それはグローバル変数の前にstaticキーワードを追加することによって達成することができ、グローバル変数は静的なグローバル変数として定義されています。これは、他のソースファイルで発生したエラーを防ぐことができます。また、非表示を果たし、モジュールの賛成で、他のソースファイル内のエラーの役割を分離します。
変数持続性の内容を保管してください
時々 、私たちは消えない関数呼び出しの終了後に、ローカル変数の関数の値をしたいが、まだ彼らの元の値を保持します。それが占有するメモリセルが解除されていない場合には、関数が呼び出される次回は、そのローカル変数がまだ存在し、それは、関数呼び出しの終わりに最後の値です。現時点では、静的ローカル変数は次のように宣言されているキーワードを使用する必要があります「静的ローカル変数を。」
ローカル変数は静的ローカル変数として宣言された場合、また、元のスタックの代わりにスタティックメモリストレージから格納されているローカル変数の格納場所を変更しました。それはグローバル変数は、実際に静的ローカル変数のように見えるように、主な違いは、グローバル変数の可視性、宣言のみが表示されたブロック内の静的ローカル変数ということです。
いくつかのサブルーチンがコール間のローカル変数の値で維持しなければならないために、静的ローカル変数は、特に重要です。静的なローカル変数が存在しない場合は、副作用の導入への扉を開く機能のこのタイプでグローバル変数を使用する必要があります。次の例に示すように、静的ローカル変数の使用の最良の例は、機能の数をカウントするために実装されます。
する#include <stdio.hの> ボイドCOUNT(); int型メイン(ボイド) { int型I = 0; のための(I = 0; I <= 5; I ++) { COUNT(); } 戻り0; } ボイド数を() { / * * /静的ローカル変数を宣言し 、静的NUM = 0 ++ NUM; のprintf( "%d個の\ N-"、NUM); }
このコードでは、我々は、カウンタとして、静的ローカル変数numの宣言にcount()関数を通過しました。静的ローカル変数はコンパイル時に初期値、および初期値は一度だけであるため、プログラムが実行されるとき、それは初期値を持ちます。初期値の後、各関数呼び出しで再ませんが、最後の関数呼び出しの終わりに値を保持します。それぞれが呼び出され、このようにして、カウント()関数では、最初の呼び出しに静的ローカル変数NUM値のままで、その後、インクリメント動作を行い、このようにカウント機能を実現します。同時に、それはグローバル変数の使用を避けることができます。
次のように上記の例として、我々は、一般的な使用シナリオでは、静的ローカル変数を描くことができます。
- 最初のコールの終了時に関数の値を保持する必要があります。
- 初期化変数をのみ、その値を変更せずに引用される場合は、各コールを再割り当てしないように、そして、静的ローカル変数がより便利である使用。
デフォルト値は0に初期化されます
静的データ領域に、すべてのバイトのメモリ内のデフォルト値は0x00です。それらは、したがって、デフォルト0である変数の値を静的データ領域に格納されており、静的変数およびグローバル変数。デモ例を以下に示します。
書式#include <stdio.hに> 静的int型g_x。 int型g_y; INTメイン(ボイド) { 静的int型X; printf( "g_x:%D \ ng_y:%D \ NXた:%d"、g_x、g_y、X)。 0を返します。 }
実行結果:
g_x:0
G_Y:0
X-:0