next up previous contents
Next: 4. 外部変数 Up: 1. 記憶クラス Previous: 2. 自動変数

3. 関数の中の静的変数

静的変数を関数内部で用いた場合、自動変数と同じくその関数内部にローカル な変数になりますが、 静的変数の特徴は、自動変数に対比して、消滅しない点にあります。つまり、 プログラムの実行から終了までの間、関数の実行に関係なく存在をしている点 にあります。それにはどのような効用があるのでしょうか。これを理解するには、 もう一つの静的変数の特徴を知る必要があります。 次のプログラムを見てください。


    test(){
        static int count=0;
        int i=0;
        i++;
        count++;
        printf("i=%d, count=%d\n",i,count);
        return;
    }

このプログラムでは count と i の両方を 0 に初期化し、インクリメントした 後に関数を終了しています。ここで、i は自動変数であることに注意しましょう。 つまり、i はブロックの最後で消滅します。従って、この関数を呼び出す度に、 変数 i は生成され、0 に初期化されて、関数の実行後消滅します。これに対して、 静的変数 count は消滅しません。しかし、関数の呼び出しの度に初期化していた ならばその意味は i とほとんど変わりはない事になってしまいます。そこで、 静的変数では初期化はプログラムの起動時に一度だけ行われるようになっている のです。これによって、count は関数が呼び出される度に、インクリメントだけ が行われます。すなわち、count には関数が何度呼び出されたかの回数が記憶 できるようになっている訳です。 そのために、上の関数 test() を何度も呼び出すと、i の値は 1 のまま変化しない のに対して、count の値は 1,2,3,4...と増えて行きます。



Noriyo Kanayama 平成14年11月26日