staticとauto修飾子

auto変数static変数
int count_print()
{
	int count = 0;
	printf("%d回目実行\n", ++count);
}
main()
{
	count_print();
	count_print();
	count_print();
}
int count_print()
{
	static int count = 0;
	printf("%d回目実行\n", ++count);
}
main()
{
	count_print();
	count_print();
	count_print();
}
1回目実行
1回目実行
1回目実行
	
1回目実行
2回目実行
3回目実行
	

staticが付かない左のローカル変数countは、 auto変数と呼ばれautoの記述を省略してきました。
省略しない時は、auto int count = 0;と書きますが、 書かないとauto変数になります。
autoの種類の変数は関数が実行する時に作られ、 関数を終える時に消滅する変数です。上記の左は関数が実行する時に、 毎回 0が記憶される変数が作られるので、 ++countで増やしても情報を残せません。
つまり、グローバル変数のように関数の処理結果を記憶して残す変数に使えません。
(引数もautoの種類の変数です。)

対して右のstaticが付くcountは、グローバル変数のように、 関数が終わった時に消滅しないので情報を残せます。 (上記右のように、関数の実行回数を数えることが可能です。)
= 0;で初期化していますが、 これは関数実行時の命令ではなく、変数を作る時の初期値指定です。 main関数がスタートする前の変数を用意する時の指定で、関数の実行時に 代入されるものではありません。
なお上記例では、関数の中で用意しいている変数なので、 この関数の中だけで使えるローカル変数です。

また関数の外側変数や、関数定義に付けたstaticは、 他のファイルから参照できないように指定として使うこともできます。

なおポインタを返す関数は、 自身の関数の中で作ったauto変数のアドレスを返す関数を作ってはいけません。 何故なら、関数がリターンした時には、 そのポインタが指し示すauto変数は消滅しているからです。 対してstatic変数は、プログラムが終了するまで消滅しないので、 そのポインタを返す関数を作ることができます。