C のストレージ クラス: Auto、Extern、Static、Register (例)

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);}

OUTPUT:

 3 2 1

C の外部ストレージ クラス

Extern は外部ストレージ クラスの略です。 Extern ストレージ クラスは、XNUMX つ以上のファイル間で共有されるグローバル関数または変数がある場合に使用されます。

キーワード 外部 元のファイルですでに定義されている変数または関数の参照を提供するために、別のファイルでグローバル変数または関数を宣言するために使用されます。

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) 新しいプロジェクトを作成し、

  1. コンソール アプリケーションを選択します
  2. [移動]をクリックします

C の外部ストレージ クラス

ステップ2) 「C」を選択して「次へ」をクリックします

C の外部ストレージ クラス

ステップ3) [次へ]をクリックします

C の外部ストレージ クラス

ステップ4) 詳細を入力して「次へ」をクリックします

C の外部ストレージ クラス

ステップ5) Finishをクリックします。

C の外部ストレージ クラス

ステップ6) 前のプログラムで示したメイン コードを main.c ファイルに配置して保存します。

C の外部ストレージ クラス

ステップ7) 新しい C ファイル ([ファイル -> 新規 -> 空のファイル]) を作成し、(original.c として) 保存して、ダイアログ ボックスで [OK] をクリックして現在のプロジェクトに追加します。

C の外部ストレージ クラス

ステップ8) main() 関数を使用せずに、前の例で示したoriginal.c ファイルの C コードを配置して保存します。

C の外部ストレージ クラス

ステップ9) プロジェクトをビルドして実行します。 結果を次の図に示します。

C の外部ストレージ クラス

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*/}
}

OUTPUT:

error: address of register variable 'weight' requested

次の表は、Cプログラミングでよく使用される各ストレージクラスの主な機能をまとめたものです。

ストレージクラス 宣言 Storage デフォルトの初期値 対象領域 永続ライセンス
オート 関数/ブロック内 メモリ 予測できない 関数/ブロック内 関数/ブロック内
登録 関数/ブロック内 CPUレジスタ ごみ 関数/ブロック内 関数/ブロック内
外部 すべての機能の外側 メモリ 設定作業無し ファイル全体および変数が extern として宣言されている他のファイル プログラムのランタイム
静的 (ローカル) 関数/ブロック内 メモリ 設定作業無し 関数/ブロック内 プログラムのランタイム
静的 (グローバル) すべての機能の外側 メモリ 設定作業無し グローバル プログラムのランタイム

まとめ

このチュートリアルでは、C のストレージ クラスについて説明しました。要約すると、次のようになります。

  • C のストレージ クラスは、変数に関する追加情報を表すために使用されます。
  • ストレージ クラスは、変数のスコープと有効期間を表します。
  • また、誰がどこから変数にアクセスできるのかもわかります。
  • Auto、extern、register、static は、C プログラムの XNUMX つの異なるストレージ クラスです。
  • ストレージクラス指定子 C言語 変数、関数、パラメータを定義するために使用されます。
  • auto は、ブロックまたは関数内で定義されたローカル変数に使用されます。
  • register は、迅速なアクセスのためのメモリ位置ではなく、CPU レジスタに変数を格納するために使用されます。
  • static はグローバル変数とローカル変数の両方に使用されます。 それぞれに C プログラム内での使用例があります。
  • Extern は、C プロジェクト ファイル間のデータ共有に使用されます。