Cのストレージクラス:さまざまなタイプのストレージクラス[例付き]
公開: 2020-10-21Cを使用したコーディングは、すべてのプログラムで変数を使用することに重点を置いています。 これらはCプログラミングの重要な側面です。 Cのすべての変数には2つのプロパティがあります。 タイプとストレージクラス。 その中で、型は変数のデータ型を参照し、 Cのストレージクラスは変数のスコープ、存続期間、および可視性を決定します。 Cのストレージクラスは、変数の有効期間、可視性、メモリの場所、および初期値を見つけるために使用されます。
このブログ投稿では、Cのストレージクラス、そのタイプ、およびその特性がプログラムの出力にどのように影響するかについて、いくつかのプログラミング例を使用して詳細に説明します。 Cのストレージクラスは、変数の情報を表すために使用されます。
Swiggy、Quora、IMDBなどのアプリケーションの構築方法を学ぶ
目次
Cのストレージクラスとは何ですか?
Cのストレージクラスは、メモリに保持される変数のストレージ領域を割り当てます。 それらはシステムのRAMに保存されます。 ストレージスペースとは別に、変数のスコープを決定します。 Cプログラムの変数は、主にデバイスのメモリとCPUレジスタであるランダムメモリの物理的な場所に格納されます。
Cのストレージクラスは、変数の有効期間も定義し、「ローカル」または「グローバル」と呼びます。 ストレージクラスは、スコープまたは可視性、および変数の初期値を定義するのにも役立ちます。 Cには主に4つのストレージクラスがあります。 自動、レジスタ、静的、および外部。 それぞれについてさらに詳しく説明します。
Cのストレージクラスはどのように宣言されますか?
Cの4つのストレージクラスは、ストレージクラス指定子auto、register、extern、staticを使用してブロックまたはプログラムで宣言されます。 構文形式で使用されるストレージクラス指定子「typedef」がもう1つあり、ストレージを予約しません。 指定子は、変数の格納についてコンパイラーに指示します。 Cの外部ストレージクラスは、定義された変数が外部リンケージで宣言されていることをコンパイラに通知します。

変数の定義と宣言には重要な違いがあります。 変数の定義とは、変数にメモリを割り当てることであり、変数を宣言することは、変数を値で初期化することを意味します。
構文:
storage_class_specifier data_type variable_name;
読む:初心者向けのC#での興味深いプロジェクトのアイデアとトピック
特殊なケース:ストレージクラス指定子がプログラムで宣言または定義されていない場合
変数宣言には、少なくとも1つのストレージクラス指定子が指定されています。 ただし、ストレージクラス指定子が指定されていない場合は、次のルールに従います。
1.関数内で宣言された変数は、自動と見なされます。
2.関数内で宣言された関数は、外部と見なされます。
3.関数の外部で宣言された変数と関数は、外部リンケージを使用して静的と見なされます。

Cのストレージクラスの種類は何ですか?
Cには4つのストレージクラスがあります。それらを見てみましょう。
1.Cの自動ストレージクラス
関数またはブロックで定義されたすべての変数は、ストレージクラスが指定されていない場合、デフォルトで自動ストレージクラスに属します。 自動ストレージクラスに属する関数またはブロックの変数は、自動指定子で宣言されます。 Cのautoの下にある変数は、それらが定義されているブロックに対してローカルであり、ブロックの外で破棄されます。
自動ストレージクラスを表示する単純なプログラム:
#include <stdio.h>
int main()
{{
auto int i = 11;
{{
auto int i = 22;
{{
auto int i = 33;
printf (“%d“、i);
}
printf (“%d“、i);
}
printf (“%d”、i);
}
プログラムの出力:
3 21
説明:
上記のプログラムでは、変数iが3回宣言されています。 同じ名前の変数は、異なるブロックで定義できます。 したがって、このプログラムはエラーなしで正常にコンパイルおよび実行されます。 最も内側のブロックの関数'printf'は3を出力し、このブロックの変数iはブロックの終了後に破棄されます。
次のブロックは2を出力し、その後に1を出力する外部ブロックが続きます。自動変数は適切に初期化されます。 そうしないと、コンパイラが初期値を提供しないため、未定義の値が取得されます。
2.ストレージクラスをCに登録します
レジスタストレージクラスに属する変数は、Cのautoと同等ですが、メモリではなくCPUレジスタに格納されるため、この名前が付けられています。 それらは頻繁にアクセスされるものです。 レジスタ指定子は、レジスタストレージクラスの変数を宣言するために使用されます。 レジスタストレージクラスの変数は、ブロックが終了したときに定義および破棄されるブロックに対してローカルです。
レジスタストレージクラスを表示する単純なプログラム:
#include <stdio.h>
int main()
{{
レジスタinti= 10;
int * p =&i; //エラー:レジスタ変数のアドレスが要求されました
printf ( "iの値:%d"、* p);
printf ( "iのアドレス:%u"、p);
}
説明:
上記のプログラムでは、コードは変数iのアドレスをポインタ変数pに取得しようとしますが、iがレジスタ変数として宣言されているため、コードはコンパイルされず、エラー「エラー:レジスタ変数のアドレスが要求されました」が表示されます。 。
特定のタイプの変数のみがレジスターに配置されます。 レジスター変数には、コンパイラーによって初期値が与えられません。
学ぶ: C ++とJava:C++とJavaの違い
3.Cの静的ストレージクラス
静的変数の可視性は、関数またはファイルの外部ではゼロですが、それらの値は呼び出し間で維持されます。 静的ストレージクラスを持つ変数は、静的指定子で宣言されます。 静的変数は関数またはファイル内にあります。 静的指定子は、ローカル変数とグローバル変数で動作が異なります。
ローカル変数とグローバル変数を持つ静的ストレージクラスを表示する単純なプログラム:
私。 ローカル変数
#include <stdio.h>
void staticDemo()
{{
static int i;
{{
static int i = 1;
printf ( "%d"、i);
i ++;
}
printf (“%d”、i);
i ++;
}
int main()
{{
staticDemo();
staticDemo();
}
プログラムの出力:
1 0
2 1
説明:
ローカル変数が静的指定子によって関数またはブロック内で定義されると、コンパイラーに永続記憶域スペースが作成されます。 静的ローカル変数は、それが指定されている関数またはブロックに表示され、関数呼び出し間でその値を保持します。 上記のプログラムでは、静的変数iはstaticDemo()関数内の2つのブロックの2つの場所で定義されています。 staticDemo()は、メイン関数で2つ呼び出されます。 次の呼び出しでは、静的変数は古い値を保持し、再度初期化する必要はありません。
ii。 グローバル変数
#include <stdio.h>
static int gInt = 1;
static void staticDemo()
{{
static int i;
printf ( "%d"、i);
i ++;
printf (“%d”、globalInt);
globalInt ++;
}
int main()
{{
staticDemo();
staticDemo();
}
プログラムの出力:
01
1 2
説明:
静的変数は、プログラムで1回だけ初期化する必要があり、存続期間を通じて保持されます。 デフォルトの初期値はゼロです。
グローバル変数または関数が静的指定子によって定義されている場合、その変数または関数は、それが定義されているファイルにのみ認識されます。 グローバル変数の場合、静的グローバル変数には内部リンクがあるため、他のファイルルーチンはその内容にアクセスして変更することはできません。 上記のプログラムでは、静的グローバル変数globalIntと静的関数staticDemo()は静的として定義されており、Cファイルの外部では使用できません。
4.Cの外部ストレージクラス
外部ストレージクラス変数または関数は、「extern」指定子によって宣言されます。 変数がextern指定子で宣言されている場合、ストレージは変数に割り当てられず、プログラムの他の場所ですでに定義されていると見なされます。 extern指定子を使用すると、変数は初期化されません。 externを使用してプログラム内の変数を指定し、外部リンケージで宣言する理由。
外部ストレージクラスを表示する単純なプログラム:
#include <stdio.h>
extern int i;
int main()
{{
printf (“ i:%d”、i);
}
int i = 1;
説明:

上記のCプログラムでは、extern int iを削除すると、変数iがprintfで使用された後に定義されるため、 「未宣言の識別子'i'」というエラーが発生します。 extern指定子は、変数iが定義され、ここで宣言されていることをコンパイラーに指示します。
externintiを変更した場合; int i=5をexternする; extern指定子が変数を初期化しないため、 「'i'の再定義」というエラーが発生します。
また読む:初心者のためのCのトップ7エキサイティングなプロジェクトのアイデア
最後の言葉
この記事では、 Cのストレージクラスの概念について詳しく説明し、そのタイプが互いにどのように異なるかを説明します。 特定のストレージクラスをいつ使用するかは、割り当てと、処理する変数のスコープ、存続期間、および可視性によって異なります。
詳細に興味があり、業界の専門家からの指導が必要な場合は、フルスタックソフトウェア開発におけるupGrad&IIITBangloreのPGディプロマを確認してください。