このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.
変数にはいろいろな属性があります.1つはいままでやってきたintやcharやdoubleの型です.そして,これから説明する記憶クラスと通用範囲(スコープ)があります.いままで出てきた変数やポインタは全て内部変数です.
記憶クラスにはauto,register,static,externがあります.それぞれどこで宣言するかで働きと通用範囲が違います.それを以下の表にまとめます.
宣言場所 記憶クラスの指定子 記憶場所 寿命 通用範囲
01: #include <stdio.h>
02: void func(void);
03: int x;
04:
05: void main(void){
06: int i;
07:
08: for( i=0; i<3; i++ ){
09: x=i;
10: func();
11 }
12: getchar();
13: }
14:
15: void func(void){
16: int i=0;
17: static int j=0;
18: printf( "x=%d i=%d j=%d\n", x, i, j );
19: i += 10;
20: j += 10;
21: }
03行目→外部変数xを定義しています.
06行目→内部変数の自動変数iを宣言しています.
08~11行→関数func()を3回呼び出します.
16行目→内部変数の自動変数iを宣言しています.
17行目→内部変数の静的変数jを宣言しています.
コンパイル・実行すると次のよう表示されます.
x=0 i=0 j=0
x=1 i=0 j=10
x=2 i=0 j=20
リターンキーを押すとプログラムは終了します.
結果を見て下さい.変数xは,外部変数ですので関数内で宣言なしに使えます.main(),func()どちらの変数でも宣言なしに外部変数xを使用しています.そのため9行目のように代入が行え,18行目のように関数printf()渡すことができます.
main関数内では外部変数xの値を更新しながら,関数func()を呼び出しています.呼び出されるごとに自動変数iは初期化されます.また,静的変数jはプログラムの実行のはじめに1回だけ初期化され,あとはその値を保持します.ですから結果を見ても,変数iの値はいつも0であるのに対し,変数jの値は呼び出されるごとに0,10,20と変化します.
このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.
2017,1 ssatoh@ 足立工科大学 工学部 情報通信工学科