静的記憶域クラス(static)

 C言語の記憶域クラス指定の中から、今回は静的記憶域クラスについて、ご紹介します。静的記憶域クラスもローカル変数のひとつです。ただ、自動記憶域クラスが、関数の処理が終了すると自動的に破棄される変数に対して、静的記憶域クラスは、関数が終了しても、その値をメモリ上に保持し続ける変数となります。プログラムが終了すると、自動的に破棄されます。

 静的記憶域クラス指定をしたい場合は、

static int a;

 このように、変数のデータ型の前に「static」と付け加えます。

 理解しにくいかもしれませんので、実験をしてみましょう。

#include <stdio.h>

void updateHighScore(int score) {
    int highScore = 0;
    
    printf("実行前のhighScore : %d\n", highScore);
    
    if(highScore < score) {
        highScore = score;
    }
    
    printf("実行後のhighScore : %d\n", highScore);
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    updateHighScore(40);
    updateHighScore(100);
    updateHighScore(80);
    
    
    return 0;
}

 このプログラムは、以下のように表示されます。

実行前のhighScore : 0
実行後のhighScore : 40
実行前のhighScore : 0
実行後のhighScore : 100
実行前のhighScore : 0
実行後のhighScore : 80

 それに対し、

#include <stdio.h>

void updateHighScore(int score) {
    static int highScore = 0;
    
    printf("実行前のhighScore : %d\n", highScore);
    
    if(highScore < score) {
        highScore = score;
    }
    
    printf("実行後のhighScore : %d\n", highScore);
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    updateHighScore(40);
    updateHighScore(100);
    updateHighScore(80);
    
    
    return 0;
}

 このプログラムは、以下のように表示されます。

実行前のhighScore : 0
実行後のhighScore : 40
実行前のhighScore : 40
実行後のhighScore : 100
実行前のhighScore : 100
実行後のhighScore : 100

 updateHighScore関数の変数highScoreがautoの場合、updateHighScore関数が終了する度に変数highScoreは破棄されるため、関数が呼び出される度に0で初期化されます。一方、highScoreがstaticの場合、C言語には変数が存在していれば初期化されない性質があり、updateHighScore関数が終了してもhighScoreがstaticの場合、破棄されずに残っているため、0で初期化されるのは初回の1回のみとなります。ゲームのハイスコアなどの場合にstatic指定を利用できるでしょう。

■スポンサーリンク

このページの先頭へ