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

⚡ スマートサマリー

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

  • 🗂️ 4つのストレージクラス: C言語では、すべての変数を記述するために、auto、register、static、externといった指定子が用意されています。
  • 🏠 オート: デフォルトのローカルクラス。そのブロック内に限定され、値が割り当てられるまではガベージ値を保持する。
  • 登録: カウンタなどの頻繁に使用される変数へのアクセスを高速化するために、CPUレジスタのストレージを要求します。
  • ♻️ 静的: 関数呼び出し間で変数の値を保持し、初回使用時にはデフォルトでゼロに設定されます。
  • 🌐 外部の: グローバル変数または関数を、再定義することなく複数のソースファイル間で共有します。
  • 📊 適用範囲と有効期間: 各クラスは、変数がどこで参照可能か、そしてどれくらいの期間存続するかを設定します。

C のストレージ クラス

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

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

新しいプロジェクトを作成する Code ブロック

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

C言語を選択してください

ステップ 3) 「次へ」をクリックします

[次へ]をクリックします

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

プロジェクトの詳細を入力する

ステップ5)「完了」をクリック

Finishをクリックします。

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

main.cにコードを追加する

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

original.cファイルを作成する

ステップ 8) 前の例で示した original.c ファイルの C コードから main() 関数を除いたものを配置して保存します。

original.cにコードを追加する

ステップ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 プログラムのランタイム

よくあるご質問

スコープはコード内で変数が参照可能な場所を決定し、ライフタイムは変数がメモリ上に保持される期間を決定します。変数はブロックスコープを持ちながら、プログラム全体にわたって有効である場合があります。

どちらもブロックスコープのローカル変数を作成しますが、autoはそれらをガベージデフォルト値でメモリに保持するのに対し、registerはより高速なCPUレジスタストレージを要求し、変数アドレスの取得を禁止します。

いいえ。registerは単なる要求であり、空いているレジスタがない場合はコンパイラが無視することがあります。最新のコンパイラはレジスタの使用を自動的に最適化するため、このキーワードが必要になることはほとんどありません。

静的変数と外部変数は、プログラム全体を通してゼロで初期化されたメモリセグメントに存在するため、ゼロから始まります。自動変数はスタックメモリを再利用し、ping 残された価値はどんなものであれ。

extern宣言は、他の場所で定義された変数を宣言するだけであり、初期化することはできません。実際の定義は1つのファイル内で行われ、ストレージを割り当て、リンクによってすべての参照がその定義にリンクされます。

ほぼそうだけど、完全に同じではない。 C++ register キーワードは非推奨となり、型推論には auto が再利用されました。static と extern は同様に動作しますが、 C++ スレッドローカルおよびクラスメンバのストレージルールを追加します。

はい。AIアシスタントは、auto、register、static、externといった変数について説明し、それぞれの変数に適した指定子を提案し、レジスタ変数のアドレスを取得するなどの誤用を警告します。

GitHubコパイロット 静的カウンタ、ファイル間をまたがる外部宣言、レジスタヒントを自動補完し、入力と同時にスコープとライフタイムをインラインで説明します。