変数の範囲


ローカル変数

今までは、つねにmain()関数しか使用しませんでしたが
自分で関数を作ったりすると、気になるのが変数の有効範囲です

前章のプログラムサンプルを見ると
main()関数と自作関数では変数はまったく別物であることがわかります
つまり、関数内の変数は他の関数では存在しないものとされます
ということは、他の関数に同名の変数が存在しても、それはまったく関係ないということです

このように、関数内で宣言された変数をローカル変数といいます
ローカル変数は、宣言された関数内でのみ有効なのです
#include<stdio.h>

void func(void);

int main() {
        int var = 10;
        printf("main()関数のvar = %d\n",var);
        func();
        printf("もう一度main()関数のvar = %d\n" , var);

        return 0;
}

void func() {
        int var = 5;
        printf("func()関数のvar = %d\n",var);
}
このプログラムを実行させると、func()関数のvarは5 main()関数のvarは10を必ず返します
当然func()関数を呼び出した後のmain()関数のvarも10を返します
これによって、双方の変数varはまったく関係ないということがわかります

より確実にこの事実を確認するには、変数のアドレスを調べれば良いですね
同じ変数名でも、アドレスが違うのならばそれはまったく別の変数といえます
#include<stdio.h>

void func(void);

int main() {
        int var;
        printf("main()関数のvar = %x\n" , &var);
        func();

        return 0;
}

void func() {
        int var;
        printf("func()関数のvar = %x" , &var);
}
得られるアドレスは異なるはずです
認識しなければいけいないのは 関数内で宣言された変数はその関数内でのみ有効ということです

それと、もう一つローカル変数で重要なことは関数終了時に消滅するということです
関数が一連の作業を終えて呼び出し元に復帰した時点で、その関数で使われた変数は消滅し
再び呼び出せば、宣言にしたがって作成されます


グローバル変数

では、どの関数からも共通して使いたい変数はどうするのでしょうか
そのような変数の場合は関数の外で宣言します
関数の外で宣言された変数をグローバル変数と呼びます
グローバル変数は、全ての関数からアクセスすることができます
しかし、全ての関数からアクセスできるために管理には注意が必要です
#include<stdio.h>

void func(void);

int var = 10;

int main() {
        printf("main() : varのアドレス = %x\n" , &var);
        printf("main() : varの内容 = %d\n" , var);
        func();
        var = 100;
        func();

        return 0;
}

void func() {
        printf("func() : varのアドレス = %x\n" , &var);
        printf("func() : varの内容 = %d\n" , var);
}
得られるアドレスは全て同じです
つまり、グローバル変数は全ての関数で共通ということです
ということは、main()関数でグローバル変数varに100を代入した後の結果も予想ができるはずです
グローバル変数はどの関数からアクセスしても共通で使用できるのです

では、一つの関数内にローカル変数とグローバル変数が同名で存在した場合はどうなるのでしょう
次のような場合を考えてみてください
#include<stdio.h>

void func(void);

int var = 10;

int main() {
        int var = 100;
        printf("%d",var);

        return 0;
}
このような場合は、ローカル変数優先で扱われます
すなわち、100が出力されます



前のページへ戻る次のページへ