スポンサーリンク

static 記憶クラス指定子の説明

変数がメモリ上のどこに確保されるか?

記憶クラスは、変数がメモリ上のどこに確保されるか、どのように維持されるか、またどのような適用範囲なのかを決める方法で、これらを【 記憶クラス指定子 】と言います。

記憶クラス指定しには幾つか有りますが、今回は【 static 】と言う記憶クラス指定子を使ったサンプルで勉強してみたいと思います。

※その他の記憶クラス指定子に付いてはまた後日機会が有れば勉強してみたいと思います。

プログラム実行中に常にメモリ上の同じ所に存在する恒久的な変数

【 static 】記憶クラス指定子は、プログラム実行中に常にメモリ上の同じ所に存在する恒久的な変数として指定する方法で、関数の中(ローカル変数に使用)で使用する方法と関数外(グローバル変数に使用)で使用出来ます。

通常の変数(ローカル変数とします)は(例: int a;)関数の処理が終わると破棄されます(メモリには残りません)。
一方グローバル変数はプログラム実行中であっても、常に存在するので値を保つことは可能ですが、他の関数内で同じ変数名を使う事が出来なくなります。(※ローカル変数の場合は同じ変数名を使うことは可能です)

【 static 】記憶クラス指定子を使うことにより、ローカル変数でありながら関数処理が終了しても値が破棄されず、関数処理が終了しても値を保たせる事が可能になります。
例:【 static int b; 】これらは静的変数と呼ばれます。通常の変数 例:【 int b; 】自動変数

サンプル
※戻り値無しの関数【 void maxa(int i) 】と【 void maxb(int j) 】はそれぞれ最大値を出力するようにしている関数です。

#include <stdio.h>

void maxa(int i);
void maxb(int j);

int main(void)
{
maxa(3);
maxa(10);
maxa(1);

maxb(3);
maxb(10);
maxb(1);

return 0;
}

void maxa(int i)
{
int max=0;
if(i > max) max=i;
printf(“maxaの最大値=%d\n”,max);
}

void maxb(int j)
{
static int max=0;
if(j > max) max=j;
printf(“maxbの最大値=%d\n”,max);
}

ソースコードの解説

それぞれ値の異なる数で【 maxa 】及び【 maxb 】(staticを使った関数)関数を呼び出し値の大きいものをそれぞれ出力するようにしています。
関数内の記述は、【 main 】関数からそれぞれ【 maxa(3) 】【 maxa(10) 】【 maxa(1) 】と三回呼び出すようにして、それぞれ値の大きい物を判定【 if(i > max)max=i 】記述にて、変数名【 max 】にそれぞれ代入し、それぞれ出力するようになっております。
※【 maxb 】関数についても同じです。

プログラムの実行結果です。
【 maxa 】と【 maxb 】の出力結果が異なるのは
【 maxa 】関数は、関数処理毎に、変数【 max 】が0に初期化される為。

 

コメント

タイトルとURLをコピーしました