C のストレージ クラス: Auto、Extern、Static、Register (例)
⚡ スマートサマリー
C言語の記憶クラスは、auto、register、static、externという4つの指定子を使用して、すべての変数のスコープ、有効期間、デフォルト値、およびメモリ位置を定義し、実行中にデータが存在する場所と存続期間を制御します。

C のストレージ クラスとは何ですか?
ストレージ クラスは、変数の可視性と場所を表します。これは、コードのどの部分から変数にアクセスできるかを示します。C のストレージ クラスは、次のことを記述するために使用されます。
- 変数のスコープ。
- 変数が保存される場所。
- 変数の初期化された値。
- 変数の存続期間。
- 変数にアクセスできるのは誰ですか?
したがって、ストレージ クラスは変数に関する情報を表すために使用されます。
注: 変数は単に データ・タイプ、その値だけでなくストレージ クラスでもあります。
C のストレージ クラスの種類は何ですか?
標準ストレージクラスは全部でXNUMX種類あります。 次の表は、C のストレージ クラスを表しています。
| ストレージクラス | 目的 |
| オート | これはデフォルトのストレージ クラスです。 |
| 外部 | グローバル変数です。 |
| 静的な | 制御が関数呼び出しに移った場合でも値を返すことができるローカル変数です。 |
| 登録 | これはレジスタ内に格納される変数です。 |
C の自動ストレージ クラス
自動ストレージクラスを使用して定義された変数は、ローカル変数と呼ばれます。 Auto は自動ストレージ クラスを表します。 変数は、明示的に指定されていない場合、デフォルトで自動ストレージ クラスに含まれます。
自動変数のスコープは、特定のブロックのみに制限されます。制御がブロックの外に出ると、アクセスは破棄されます。つまり、自動変数が宣言されているブロックのみがその変数にアクセスできます。
キーワード auto は、自動ストレージ クラスを定義するために使用されます。 デフォルトでは、auto 変数にはガベージ値が含まれています。
Example, auto int age;
以下のプログラムは XNUMX つのローカル変数を持つ関数を定義しています。
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 ストレージ クラスは、XNUMX つ以上のファイル間で共有されるグローバル関数または変数がある場合に使用されます。
キーワード 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;}
XNUMX 番目のファイル: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 ファイルを作成します [ファイル -> 新規 -> 空のファイル]、(original.c として) 保存し、ダイアログボックスで「OK」をクリックして現在のプロジェクトに追加します。
ステップ 8) 前の例で示した original.c ファイルの C コードから main() 関数を除いたものを配置して保存します。
ステップ9)プロジェクトをビルドして実行します。結果は次の図に示されています。
C の静的ストレージ クラス
静的変数は、関数/ファイル内でローカル静的変数として使用されます。 として使用することもできます。 グローバル変数
- 静的ローカル変数は、関数呼び出しまたはブロック間でその値を保持および格納し、それが定義されている関数またはブロックに対してのみ参照可能なローカル変数です。
- 静的グローバル変数は、宣言されたファイル内でのみ参照可能なグローバル変数です。
Example: static int count = 10;
静的変数のデフォルトの初期値はゼロであり、その存続期間中に XNUMX 回だけ初期化されることに注意してください。
#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 キーワードを使用して宣言または初期化された変数には、デフォルト値として常に XNUMX が含まれます。
Cでストレージクラスを登録する
レジスタ ストレージ クラスは、関数内またはブロック内のローカル変数を CPU レジスタの代わりに保存する場合に使用できます。 RAM これらの変数にすばやくアクセスできるようになります。 たとえば、「カウンター」はレジスターに保存するのに適した候補です。
Example: register int age;
キーワード`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プログラミングでよく使用される各ストレージクラスの主な機能をまとめたものです。
| ストレージクラス | 宣言 | Storage | デフォルトの初期値 | 対象領域 | 生涯保証 |
| オート | 関数/ブロック内 | メモリ | 予測できない | 関数/ブロック内 | 関数/ブロック内 |
| 登録 | 関数/ブロック内 | CPUレジスタ | ごみ | 関数/ブロック内 | 関数/ブロック内 |
| 外部 | すべての機能の外側 | メモリ | Zero | ファイル全体および変数が extern として宣言されている他のファイル | プログラムのランタイム |
| 静的 (ローカル) | 関数/ブロック内 | メモリ | Zero | 関数/ブロック内 | プログラムのランタイム |
| 静的 (グローバル) | すべての機能の外側 | メモリ | Zero | プログラムのランタイム |



![[次へ]をクリックします](https://www.guru99.com/images/1/020819_0708_StorageClas3.png)




