通用範囲は変数や関数の有効範囲です。
関数の初めに宣言された自動変数はその関数だけでしか有効ではありません。
では、どの関数からも参照できるようにしたい場合はどうするの?となります。その場合、関数の外で宣言するのです。このような変数は外部変数(グローバル変数)、関数内で宣言した変数は局所変数といいます。
※ただし外部変数も宣言したファイル内のみ有効で別のファイルからも参照したいときはextern宣言をしないといけません。しかしある程度C言語を覚えるまでは、あまりファイルを増やさない方が理解しやすいと思いますので、ここでは説明をしないようにします。
例を見ていきましょう。
#include <stdio.h>
void func1(int, int); /*関数の宣言*/
int a; /*外部変数*/
int main()
{
int b;
int c;
a = 1;
b = 2;
c = 3;
printf("func1を通る前のmain内\n");
printf("表示 a = %d, b = %d\n\n", a, b);
func1(a, b);
printf("func1を通った後のmain内\n");
printf("表示 a = %d, b = %d\n", a, b);
return 0;
}
void func1(int x, int y){
int b;
a = x;
b = y;
printf("func1内 値渡し後\n");
printf("表示 a = %d, b = %d\n\n", a, b);
a = 1000;
b = 2000;
/*c = 3000; 'c'は定義されていないと怒られる*/
printf("func1内 aに1000を代入、bに2000を代入\n");
printf("表示 a = %d, b = %d\n\n", a, b);
}
実行結果は

になります。
外部変数aは関数func1内でも有効ですが、mainで宣言された変数bと関数func1で宣言された変数bは名前が同じでもそれぞれ宣言された関数内でしか有効ではないのです。func1内で、c
=3000; なんか入力したなら私の環境のコンパイラなら'c'は定義されていないと怒られます。よってコメントにしています。
ここでコメントがでましたので説明します。
プログラム中の/* と */ の間にある文はコンパイラに無視されるため、コメントを何千、何万行と書いても実行モジュールの大きさは大きくなりません。よって後々ソースを見直すときにわかりやすくコメントを入れておくのもよい方法だと思います。
※コメントは入れ子にはできない。つまり
/* /* これはコメントだよ */ コメントになる */
とはできません。
関数の外で宣言した変数。その変数が宣言したファイル内であればどこからでも参照できます。
変数を宣言した別のソースファイルから参照する場合はextern宣言をすれば参照できるようになります。
もし、外部変数にしたいけど、そのファイル内のみ有効にしたい場合はstaticをつけて宣言すればよいです。
関数の中で宣言した変数。ブロック内だけで有効になります。
void func()
{
int a; /*ここから変数aが有効*/
a = 1;
printf("a = %d\n",a);
} /*ここまでで変数aの有効範囲は切れます*/
変数は大抵の場合関数の最初に宣言するが関数内のブロックの先頭でも宣言できます。これもちょっと分かりにくいので例を見ていきましょう。
void func()
{
int a; /*ここから変数aが有効*/
a = 1;
printf("a = %d\n",a);
int b; /* 途中にまた変数を宣言。しかしこの行はエラーになる。*/
{
int b; /*このようにブロックではさむと途中でも変数を宣言できる*/
b = 2;
printf("b = %d\n",b);
} /*ここまでで変数bの有効範囲は切れます*/
printf("b = %d\n",b); /*'b'は定義されていないとコンパイラに怒られる*/
} /*ここまでで変数aの有効範囲は切れます*/