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

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

③ローカル変数とグローバル変数

スポンサーリンク

前日記憶クラスの実践的な基本を載せた。
今日はもう少し詳しい内容を載せる。

一般的な変数にはローカル変数とグローバル変数がある。
ローカル変数はコードブロック(分かりやすくいうと{ }←この中の部分)の先頭で宣言することができる
その寿命はコードブロックの中だけである。これをローカル変数のスコープ(識別可能な範囲、見える範囲)と呼ぶ。

void kumasan{
int hensuu1;
-----;
-----;
if(hensuu1!=0){
int hensuu2;
----;
/*範囲A*/
----;
}
----;
/*範囲B*/
}

こんな関数があったとしよう。
当然範囲Aではhensuu1,hensuu2は共に使える。
しかし
範囲Bではhensuu1は使えるがhensuu2は存在しない。
なぜなら寿命が終わってしまっているからである。

そして、一旦関数kumasanが終了し別の場所でもう一度これ等が呼び出されたとき
hensuu1,hensuu2は全く別の変数として復活する。
何度も何度も同じ関数kumasanが呼び出されたとき、hensuu1,hennsuu2もその数だけ初期化され生産される。
そこで一つの変数を持続させるために考え出されたのがstaticローカル変数である。
書き方は簡単で、前にstaticと書くだけである。
こうすることでプログラム開始時に一回だけ初期化され後は使いまわすことができる。

void kumasan{
static int hensuu1;
-----;
-----;
if(hensuu1!=0){
static int hensuu2;
----;
/*範囲A*/
----;
}
----;
/*範囲B*/
}

当然範囲Aではhensuu1,hensuu2は共に使える。
しかし
範囲Bではhensuu1は使えるがhensuu2は存在するが見えていない(範囲内にない)ので使えない。
という感じになる。

では常に見えている状態にするにはどうしたらよいか?このときにグローバル変数を使う、
これも簡単関数の外側に書くだけである。

int globalhensuu;
int globalhensuu;

void kumasan{
static int hensuu1;
-----;
-----;
if(hensuu1!=0){
static int hensuu2;
----;
/*範囲A*/
----;
}
----;
/*範囲B*/
}

これを使うにあたって留意しなければいけないこととして初期化文がなくてもゼロに初期化されるということと、
何より誤用があった場合に避けられないということである。(ローカル変数と併用だったときはローカル変数が優先される)


さらに、外部ファイルから変数や関数を流用したい場合に有効なのがexternである。
プロトタイプ宣言時にextermをつけることでファイル間を越えた変数や関数を使うことができる。
externは変数宣言として扱われない。

このように外部の変数の値を別のファイルで書き換えることが可能である。
しかしセキュリティの面で非常に危ないので標準ファイルなど変える必要のない変数はconstが付けられている。
constを付ければ別関数からはポインタのさす変数の値を変更できなくなる。





昔書いた文章なので文体に差異がある。
参考資料
忘れた。