関数の中で宣言された変数は、ローカル変数(内部変数)と呼びます。ローカル変数は、他の関数に影響を与えないという意味で非常に良い性質を持ちますが、複数の関数の間で同じ変数を共有するということができません。基本的に、複数の関数の間で値を受け渡しするにはパラメータと戻り値を用いるべきですが、特定の関数の間ではなく、より広域的にデータを共有したいということもあるでしょう。このようなときに使われるのが、関数の外で宣言されるグローバル変数(外部変数)です。
グローバル変数は、関数の外で宣言された変数という点を除けば、普通の変数です。これまでの変数と同じように、型と名前を指定し、任意の関数の処理で値を代入したり、取得したりすることができます。ただし、グローバル変数の値はすべての関数で共有されるため、個々の関数が無秩序に値を変更すると、思わぬバグを生み出す温床になるので注意が必要です。
サンプル06
#include <stdio.h>
int value;
void showValue(void)
{
printf("value=%d\n", value);
}
int main(void)
{
value = 100;
showValue();
return 0;
}
実行結果
![]() |
サンプル06の実行結果 |
サンプル06は、関数の外にint型のvalue変数を宣言しています。この変数はグローバル変数として機能するため、ファイル全体がスコープとなります。よって、複数の関数からvalue変数を利用することができます。このプログラムでは、main()関数でvalue変数に100を代入し、その後 showValue()変数でvalue変数を表示しています。どちらの関数からも、value変数を利用できていることが確認できます。
グローバル変数とローカル変数が同じ名前の場合、ローカル変数が優先されます。次のような場合、実行結果がどのようになるか想像してください。
int value = 10;
void func(void)
{
int value = 100;
printf("%d\n", value)
}
グローバル変数valueは10で初期化され、func()関数内のローカル変数valueは100で初期化されています。func()関数内で、printf()関数のパラメータとしてvalue変数を指定しています。printf()関数は、パラメータに指定されたvalue変数の値を表示しますが、このときどちらの値が用いられるかが問題です。結果は、ローカル変数の値が優先され100となります。