ポインタのお話〜スコープって何?〜

【スコープって何?】

スコープのことを説明しないといけない…と思いつつ、どこにこの話を入れるか悩んだ挙げ句、最後になってしまいました…。(^^;)

さて、「スコープ」って何でしょう?

平たく言えば、変数の有効範囲のことです。
変数は宣言した場所によって、それ自身を使うことができるエリアが決まってしまいます。
使うことができるエリアを外れてしまうと変数は破棄されてしまいますので、このことに注意してプログラムを組む必要があります。

具体的にどうなるのかは、例を見てもらいましょう。

例)スコープの例

 #include "hoge"
 int iData1;               ↑iData1の有効範囲
                           │
 int main(void){           │
   int iData2;             │ ↑iData2の有効範囲
    :                      │ │
   if(hogehoge){           │ │
    int iData3;            │ │ ↑iData3の有効範囲
     :                     │ │ ↓
   }                       │ │
    :                      │ │
   return 1;               │ ↓
 }                         │
                           │
 int fnkCheck(int iData4){ │ ↑iData4の有効範囲
   int iData5;             │ │ ↑iData5の有効範囲
    :                      │ ↓ ↓
 }                         │
                           ↓

各変数の説明:

iData1 グローバル変数
宣言した位置から、ファイルの後わりまで有効
iData2 main関数のローカル変数
main関数内の宣言した位置から、main関数の終わりまで有効
iData3 main関数のif条件内でのローカル変数
if文内の宣言した位置から、ifが終わるまで有効
iData4 fnkCheck関数のローカル変数
fnkCheck関数内の宣言した位置から、fnkCheck関数の終わりまで有効
iData5 fnkCheck関数のローカル変数
fnkCheck関数内の宣言した位置から、fnkCheck関数の終わりまで有効

上記で示した有効範囲を抜けてしまうと、変数は破棄されてしまいます。変数が破棄されるということは、値を入れておく器がなくなってしまうということです。変数が破棄されると、中に入っていた値は消えてなくなってしまいます。

もし、ある変数の値をほかの関数に渡したい場合には、

  1. ポインタ変数を使って値を入れる器をお借りする
  2. 値だけを関数の戻り値として返してやる

の2つのパターンをつかわないとせっかく必要な値を得られたのになくしてしまうことになります。
# ここでもグローバル変数は無視します…。(^^;)

プログラムを組む際には、変数の有効範囲・スコープを考えましょうね。