C ストレージ クラス
C ストレージ クラス
このチュートリアルでは、ローカル変数とグローバル変数のスコープと有効期間について学習します。また、静的変数とレジスタ変数についても学習します。
C プログラミングのすべての変数には、タイプとストレージ クラスの 2 つのプロパティがあります。
タイプとは、変数のデータ型を指します。また、ストレージ クラスによって、変数のスコープ、可視性、有効期間が決まります。
ストレージ クラスには 4 つのタイプがあります:
<オール>ローカル変数
ブロック内で宣言された変数は、自動変数またはローカル変数です。ローカル変数は、それが宣言されているブロック内にのみ存在します。
例を見てみましょう。
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; ++i) {
printf("C programming");
}
// Error: i is not declared at this point
printf("%d", i);
return 0;
}
上記のプログラムを実行すると、エラー
undeclared identifier i
が表示されます。 . 私だからです for
内で宣言されています ループブロック。ブロックの外では宣言されていません。
別の例を見てみましょう。
int main() {
int n1; // n1 is a local variable to main()
}
void func() {
int n2; // n2 is a local variable to func()
}
上記の例では、n1 main()
にローカルです と n2 func()
にローカルです .
これは、n1 にアクセスできないことを意味します func()
内の変数 main()
内にのみ存在するため .同様に、n2 にはアクセスできません main()
内の変数 func()
内にのみ存在するため .
グローバル変数
すべての関数の外で宣言される変数は、外部変数またはグローバル変数と呼ばれます。プログラム内のどの関数からでもアクセスできます。
例 1:グローバル変数
#include <stdio.h>
void display();
int n = 5; // global variable
int main()
{
++n;
display();
return 0;
}
void display()
{
++n;
printf("n = %d", n);
}
出力
n = 7
file1
でグローバル変数が宣言されているとします。 .その変数を別のファイル file2
で使用しようとすると 、コンパイラは文句を言います。この問題を解決するには、キーワード extern
file2
で使用されます 外部変数が別のファイルで宣言されていることを示します。
変数の登録
register
キーワードは、レジスタ変数を宣言するために使用されます。レジスタ変数は、ローカル変数よりも高速であるはずでした。
ただし、最新のコンパイラはコードの最適化に非常に優れており、レジスタ変数を使用するとプログラムが高速化される可能性はほとんどありません。
特定のアプリケーション用にコードを最適化する方法を知っている組み込みシステムで作業している場合を除き、レジスタ変数は使用できません。
静的変数
静的変数は、static
を使用して宣言されます キーワード。例えば;
static int i;
静的変数の値は、プログラムが終了するまで持続します。
例 2:静的変数
#include <stdio.h>
void display();
int main()
{
display();
display();
}
void display()
{
static int c = 1;
c += 5;
printf("%d ",c);
}
出力
6 11
最初の関数呼び出し中、c の値 は 1 に初期化されます。その値は 5 増加します。ここで、c の値は は 6 で、画面に表示されます。
2 回目の関数呼び出し中、c 再度 1 に初期化されません。 cだからです 静的変数です。値 c は 5 増加します。これで、その値は 11 になり、画面に表示されます。
C言語