ローカル変数、グローバル変数と、寿命の異なる変数を取り上げてきましたが、
実は、この2つの中間的な存在である、変わった特徴を持つ変数が存在します。
関数内で変数を宣言する時に、型名の前にstatic(スタティック)とつけることで、
静的なローカル変数を宣言することが出来ます。
次のプログラムは、静的なローカル変数を宣言した例です。
このプログラムの実行結果は、次の通りになります。#include <stdio.h> int countfunc(void); int main(void) { countfunc(); countfunc(); countfunc(); return 0; } int countfunc(void) { static int count; /* 静的なローカル変数 */ count++; printf("%d\n",count); return count; }
関数内で宣言したにもかかわらず、呼び出し毎に値が1ずつ増えていますし、
1
2
3
しかし、変数countは関数内で宣言されている以上、ローカル変数です。
実際、main関数内で変数countを使用すると、エラーとなります。
これが、静的なローカル変数の特徴です。
関数内で宣言されているので、使用出来るのは宣言された関数内のみですが、
その値はプログラムが終了するまで残るのです。
また、特に初期化しなくても、自動的に0に初期化されます。
なお、初期化は初めに1回だけしか行われませんので、
例えば、次のように初期化を行った場合もカウント出来ます。
この変数は、関数が以前に呼び出された時の値を覚えておきたい場合に使用されます。static int count = 0; /* 静的なローカル変数 */