C言語で使われている変数には、様々なタイプがあり、それぞれが重要な役割を持っています。
よく使われているものは、以下の5つです。
・ ローカル変数(局所変数, local variable)
・ グローバル変数(大域変数, global variable)
・ 静的変数(static variable)
・ 自動変数(automatic variable)
・ 外部変数(external variable)
ローカル変数
ローカル変数は、関数やブロックの中で宣言された変数のことをいいます。
1 2 3 4 5 6 7 8 |
#include <stdio.h> int main(void) { int a = 10; // ローカル変数 return 0; } |
グローバル変数
グローバル変数は関数やブロックの外で宣言された変数のことをいいます。
グローバル変数のメリットは、どの関数からでも値を変更したり利用したりすることができるところです。
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> int b = 1000; int main(void) { int a = 10; // ローカル変数 return 0; } |
静的変数
静的変数(スタティック変数)は、static修飾子が付いた変数のことをいいます。静的変数は複数の関数呼び出しの間で値を保持します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> void func() { static int a = 10; // 静的変数 int b = 10; // ローカル変数 a = a + 1; b = b + 1; printf("static: %d, local: %d\n", a, b); } int main(void) { func(); func(); func(); func(); func(); return 0; } |
このコードを実行すると、
1 2 3 4 5 6 7 |
static: 11, local: 11 static: 12, local: 11 static: 13, local: 11 static: 14, local: 11 static: 15, local: 11 |
となります。
静的変数とローカル変数が宣言されているfunc()を呼び出すと、何回呼び出してもローカル変数は同じ値を出力しますが、静的変数は+1された値を出力しています。
自動変数
自動変数とは、普段の変数のことです。
自動変数は宣言した関数やブロックの中だけで有効なので、その部分の処置が終わるとメモリの領域が解放されて変数に入れていた値も読めなくなります。
先ほど説明した静的変数は、自動変数とは違い関数が終了してもメモリ領域が解放されないので、複数の関数呼び出しの間でも値を保持することができるわけです。
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> int main(void) { int a = 10; // ローカル変数 auto int b = 20; // 自動変数 return 0; } |
関数やブロック内で宣言される変数は、デフォルトでは全て自動変数です。
変数aはローカル変数ですが、自動変数でもあります。
また、『auto』を使うことで明示的に自動変数を宣言することもできます。
外部変数
変数をあるプログラムコード内でどの関数からも呼び出す場合にはグローバル変数を使いますが、
1つのプログラムコードからではなく様々なところから変数を使いたい場合には、外部変数を使います。
外部変数を使うためには『extern』修飾子を使います。
1 2 3 4 5 6 7 8 9 10 |
// sample.c #include <stdio.h> #include "extern.h" int main(void) { printf("extern variable: %d\n", extern_a); return 0; } |
1 2 3 4 |
//extern.h extern int extern_a = 10000; |
このプログラムを実行すると、以下のようになります。
1 2 3 |
extern variable: 10000 |