変数は必ず宣言してから利用する。ただし宣言したからといって、 プログラムのどこでも使えるようになるわけではなく、必ず有効範囲が 決まっている。この有効範囲のことをスコープという。
変数は、宣言する場所によって利用できる場所が限定される。 変数は、宣言したブロックの中でのみその名前を参照できる。
#include <stdio.h>
void foo()
{
int x;
int y
:
:
}
int main(int argc, char *argv[])
{
char buf[100];
FILE *fp;
if (NULL == (fp=fopen("score.dat", "r"))) {
char altfile[10];
printf("score.datがないので、代わりのファイル名を入れて: ");
fgets(altfile, sizeof altfile, stdin);
altfile[strlen(altfile)-1] = '\0';
fp=fopen(altfile, "r");
}
:
:
}
}
関数 foo()
内で宣言した変数 x, y
は
その内部でのみ x, y
の名前で参照できる。また、
main()
関数内で宣言した変数 buf, fp
は
main
全体で参照でき、if
ブロック内で宣言した
altfile
変数はif
の内部でのみ参照できる。
関数内部で宣言した変数のことを局所変数(ローカル変数)といい、 関数内部でのみ有効となる。逆に関数外部で宣言した変数は大域変数 (グローバル変数)といい、全ての関数で利用できる。一見便利に思えるが、同じ 名前の変数を使わないように気をつけなければならないので、原則として利用し てはいけない。
全ての関数の外で宣言する変数は、原則としてリンクする
全てのソースファイルからアクセスできる。たとえば、
foo.c bar.c baz.c
三つのソースでプログラムを作成する場合、
foo.c
に
int hoge;
void abc() {...}
void xyz() {...}
として変数 hoge を宣言すると、bar.c baz.c
からは、以下のように宣言すると変数 hoge
を参照できる。
int hoge;
void tekitou()
{
extern int x;
:
}
逆に、キーワード static をつけて宣言した変数は、
そのファイルの中からしかアクセスできない。foo.c
で
static int hoge;
void abc() {...}
void xyz() {...}
と変数 hoge
を宣言すると、foo.c
の
中で定義している関数からしかアクセスできない。