C のストレージ クラス:C の auto、extern、static、register クラス
C のストレージ クラスとは?
ストレージ クラスは、変数の可視性と場所を表します。コードのどの部分から変数にアクセスできるかを示します。 C のストレージ クラスは、次のことを記述するために使用されます:
- 変数のスコープ
- 変数が保存される場所
- 変数の初期化された値。
- 変数の寿命。
- 変数にアクセスできるのは誰ですか?
したがって、ストレージ クラスは、変数に関する情報を表すために使用されます。
注:変数は、データ型、その値だけでなく、ストレージ クラスにも関連付けられています。
標準ストレージ クラスには、合計 4 つのタイプがあります。次の表は、C のストレージ クラスを表しています。
ストレージ クラス 目的 自動 デフォルトのストレージ クラスです。extern グローバル変数です。static 関数呼び出しに制御が移った場合でも値を返すことができるローカル変数です。レジスタ これは、レジスタ内に格納される変数です。この C チュートリアルでは、例を使用して C のさまざまなタイプのストレージ クラスを学習します-
- C の自動ストレージ クラス
- C の Extern ストレージ クラス
- 最初のファイル:main.c
- 2 番目のファイル:original.c
- C の静的ストレージ クラス
- C でストレージ クラスを登録する
C の自動ストレージ クラス
auto ストレージ クラスを使用して定義された変数は、ローカル変数と呼ばれます。 Auto は、自動ストレージ クラスの略です。明示的に指定されていない場合、変数はデフォルトで auto ストレージ クラスにあります。
auto 変数のスコープは、特定のブロックのみに限定されます。コントロールがブロックの外に出ると、アクセスは破棄されます。これは、auto 変数が宣言されているブロックのみがそれにアクセスできることを意味します。
キーワード auto は、auto ストレージ クラスを定義するために使用されます。デフォルトでは、auto 変数にはガベージ値が含まれています。
Example, auto int age;
以下のプログラムは、2 つのローカル変数を持つ関数を定義します
int add(void) { int a=13; auto int b=48; return a+b;}
互いに独立している各ブロック コード内の auto 変数のスコープ レベル「可視性レベル」を示す別のプログラムを使用します。
#include <stdio.h> int main( ) { auto int j = 1; { auto int j= 2; { auto int j = 3; printf ( " %d ", j); } printf ( "\t %d ",j); } printf( "%d\n", j);}
出力:
3 2 1
C の Extern ストレージ クラス
Extern は、外部ストレージ クラスの略です。 Extern ストレージ クラスは、2 つ以上のファイル間で共有されるグローバル関数または変数がある場合に使用されます。
キーワード extern 元のファイルで既に定義されている変数または関数の参照を提供するために、別のファイルでグローバル変数または関数を宣言するために使用されます。
extern キーワードを使用して定義された変数は、グローバル変数と呼ばれます。これらの変数は、プログラム全体でアクセスできます。 extern 変数は初期化できないことに注意してください。元のファイルで既に定義されています。
Example, extern void display();
最初のファイル:main.c
#include <stdio.h> extern i; main() { printf("value of the external integer is = %d\n", i); return 0;}
2 番目のファイル:original.c
#include <stdio.h> i=48;
結果:
value of the external integer is = 48
上記のコードをコンパイルして実行するには、次の手順に従います
ステップ 1) 新しいプロジェクトを作成、
<オール>
ステップ 2) C を選択し、[次へ] をクリックします
ステップ 3) [次へ] をクリックします
ステップ 4) 詳細を入力して [次へ] をクリックします
ステップ 5) [完了] をクリックします
ステップ 6) 前のプログラムに示したメイン コードを main.c ファイルに入れて保存します
ステップ 7) 新しい C ファイルを作成 [File -> new -> Empty File し、(original.c として) 保存し、ダイアログ ボックスで [OK] をクリックして現在のプロジェクトに追加します。
ステップ 8) 前の例に示した original.c ファイルの C コードを main() 関数なしで配置して保存します。
ステップ 9) プロジェクトをビルドして実行します。結果は次の図に示されています
C の静的ストレージ クラス
静的変数は、関数/ファイル内でローカル静的変数として使用されます。グローバル変数としても使用できます
- 静的ローカル変数は、関数呼び出し間またはブロック間でその値を保持および格納し、それが定義されている関数またはブロックにのみ表示されるローカル変数です。
- 静的グローバル変数は、それが宣言されているファイルにのみ表示されるグローバル変数です。
Example: static int count = 10;
静的変数のデフォルトの初期値は 0 であり、その有効期間内に 1 回だけ初期化されることに注意してください。
#include <stdio.h> /* function declaration */ void next(void); static int counter = 7; /* global variable */ main() { while(counter<10) { next(); counter++; } return 0;} void next( void ) { /* function definition */ static int iteration = 13; /* local static variable */ iteration ++; printf("iteration=%d and counter= %d\n", iteration, counter);}
結果:
iteration=14 and counter= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
グローバル変数はファイル全体からアクセスできますが、静的変数はコードの特定の部分のみにアクセスできます。
静的変数の寿命は、プログラム コード全体にあります。 static キーワードを使用して宣言または初期化された変数には、デフォルト値として常にゼロが含まれます。
C にストレージ クラスを登録する
関数またはブロック内のローカル変数を RAM ではなく CPU レジスタに格納して、これらの変数にすばやくアクセスする場合は、register ストレージ クラスを使用できます。たとえば、「カウンター」は、レジスターに格納するのに適した候補です。
Example: register int age;
キーワード 登録 レジスタ ストレージ クラスを宣言するために使用されます。 register ストレージ クラスを使用して宣言された変数には、プログラム全体で寿命があります。
これは auto ストレージ クラスに似ています。変数は特定のブロックに限定されます。唯一の違いは、register ストレージ クラスを使用して宣言された変数が、メモリではなく CPU レジスタ内に格納されることです。レジスタはメイン メモリより高速にアクセスできます。
register ストレージ クラスを使用して宣言された変数には、デフォルト値がありません。これらの変数は、多くの場合、プログラムの開始時に宣言されます。
#include <stdio.h> /* function declaration */ main() { {register int weight; int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/} }
出力:
error: address of register variable 'weight' requested
次の表は、C プログラミングで一般的に使用される各ストレージ クラスの主な機能をまとめたものです
ストレージ クラス 宣言 ストレージ デフォルトの初期値 範囲 生涯 自動 関数/ブロック内MemoryUnpredictable関数/ブロック内関数/ブロック内レジスタ 関数/ブロック内CPU RegistersGarbage関数/ブロック内関数/ブロック内extern すべての関数の外側MemoryZero変数が externprogram ランタイムとして宣言されているファイルおよびその他のファイル全体静的 (ローカル) 関数/ブロック内MemoryZero関数/ブロックプログラム ランタイム内静的 (グローバル) すべての関数の外側MemoryZeroGlobalプログラム ランタイムまとめ
このチュートリアルでは、C のストレージ クラスについて説明しました。要約すると、次のとおりです。
- C のストレージ クラスは、変数に関する追加情報を表すために使用されます。
- ストレージ クラスは、変数のスコープと寿命を表します。
- また、誰がどこから変数にアクセスできるのか?
- Auto、extern、register、static は、C プログラムの 4 つの異なるストレージ クラスです。
- C 言語のストレージ クラス指定子は、変数、関数、およびパラメーターを定義するために使用されます。
- auto は、ブロックまたは関数内で定義されたローカル変数に使用されます
- register は、すばやくアクセスできるメモリ位置ではなく、変数を CPU レジスタに格納するために使用されます。
- 静的変数は、グローバル変数とローカル変数の両方に使用されます。それぞれに C プログラム内での使用例があります。
- Extern は、C プロジェクト ファイル間のデータ共有に使用されます。
C言語