電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

②記憶クラス

スポンサーリンク

記憶クラスにはauto,register,static,externがある。
どこに変数を入れたいかで使い所が違う。

「auto」は一般的な変数で通常は記述しない。
大抵はこれにintやcharをつけてauto int a;とか宣言するのを省いてint a;とか書いている。
関数の中で宣言され、そのブロック内でのみ有効。
ブロック初めにスタックで生成されブロック終了と共に消える。
ローカル変数と言ったほうが馴染み深い。

「register」はレジスタに割り当てる。同様にregister int a;とか書ける。
数に制限があるがスピードが上がるので使用頻度の高い変数につける。

「static」は静的変数と呼ばれその関数内で使用可能。プログラムの開始から終了まで消えないので最後の値が入り続けることになる。

#include<stdio.h>
fanc(void);

int a=10;
int b=10;
main(){
	int i;
	for(i=0;i<5;i++)	
		fanc();
}
fanc(void){
	int b=0;
	static int c=0;
	register int d=0;
	 a+=10;
	 b+=10;
	 c+=10;
	 d+=10;
   
printf( "a=%d\tb=%d\tc=%d\td=%d\n",a, b, c, d ); 
}

結果
a=20 b=10 c=10 d=10
a=30 b=10 c=20 d=10
a=40 b=10 c=30 d=10
a=50 b=10 c=40 d=10
a=60 b=10 c=50 d=10

見て分かる通りaはグローバル変数bはグローバル変数と自動変数を混在させたものcがstatic変数でdがregister変数。
[a]はグローバル変数宣言の時に10を代入しているので20から始まり、
以降ループされるごとに10が足されている。
[b]はa同様に10をグローバル変数宣言で代入しているが、ローカル変数で宣言をした時点でグローバル変数が上書きされ10から始まり、ブロック終了と共に初期化されているので以降宣言の10が繰り返される。ローカルのほうがグローバルより強いからである。
[d]はregister宣言で基本的にローカル変数と変わらない動きをする。
問題は[c]であってstatic宣言をすると関数が終了しても値が初期化されずプログラムが終了するまで消滅しないので10、20、30・・と増えていく。



ここまででauto,register,staticの説明は終える。
これらは大体感覚的に分かるが残った「extern」だけは他と違う。
「extern」は外部変数と呼び、「定義」され、プログラム内のすべての関数内で使える。
定義は宣言とは違う。最大の違いはメモリを割り当てるか否かである。
externで定義された変数はコンパイラに変数の位置を教えるだけであってメモリを割り当てることはしない。
要するにプログラム開始時にグローバル変数として宣言された変数一度だけメモリに割り当てられ、それ以外でその関数を定義しても割り当てられたものを使う、という使われ方をする。
このことから2つ以上のファイル間で同じ変数を使うときにしか使わない。


参照web
http://www.cis1.c.dendai.ac.jp/c_master/C_14.htm
http://wisdom.sakura.ne.jp/programming/c/c50.html