Pas-Time / VC++ MEMO / 変数のスコープ [BACK]
変数のスコープ
C言語の変数には、スコープという変数の記憶期間(?)があります。
わかりやすくいえば、期末テスト前の人間が勉強して記憶した内容は
、期末テスト終了後、その記憶内容がき得るという感じです。(テストの
内容は必要なんで、なるだけ忘れないようにしてくださいね(苦笑))
管理者は、このスコープの管理で失敗してプログラムがよく止まります。
管理者に使われているFIVAさんは本当に大変です…(苦笑。そのうち
つぶれるかも(汗。そこで、スコープのことを少々まとめてみたい
とおもいます。
スコープは、次の5種類があります。
- ローカルスコープ
ブロック内で宣言された名前を使えるのは、このブロック内と、
そのブロックで囲まれているブロックの内であり、この宣言の
位置以降に限られます。関数への仮引数の名前は、この関数の
もっとも外側のブロック宣言されたかのように扱われます。
つまり、関数本体を囲むブロックの内側で宣言されたように
ローカルスコープをもちます
ここで、aの変数は存在しない
>
{
int a; /* 以降「}」まで、aが使える */
}
ここで、aの変数は存在しない
- 関数スコープ
関数のスコープをもつ名前はラベルだけです。ラベルは関数内の
どこでもつかえますが、関数外では使えません
ここで、aの変数は存在しない
void func(void) {
int a; /* 以降「}」まで、aが使える
}
ここで、aの変数は存在しない
- ファイルスコープ
名前をすべてのブロックまたはクラスの外側で宣言すると、
その名前はファイルスコープをもちます。ファイルスコープ
をもつ名前には、翻訳単位内の宣言以降でアクセスできます。
ファイルスコープを持つ名前は”グローバル”名ともいいます。
ただし、静的オブジェクトを宣言する名前を除きます。
ここで、aの変数は存在しない
int a; /* 以降プログラム終了まで存在する */
- クラススコープ
クラスメンバの名前はクラススコープを持ちます。
クラスメンバ関数を使えるのは、このクラスの
オブジェクトに対するメンバ選択演算子(または->)に
限られます。クラスの非静的メンバデータは、この
クラスのオブジェクトにローカルであるとみなされます。
ここで、aの変数は存在しない
class point {
int a; /* 以降「}」まで、aが使える
}
ここで、aの変数は存在しない
- プロトタイプスコープ
関数プロトタイプ内で宣言された名前は、このプロトタイプ
の終わりまで有効です。次のプロトタイプでは2つの名前(sz
Dest と szSource)を宣言しています。この2つの名前はプロト
タイプの終るところでスコープの外にでます。
char *strcpy( char *szDest, const char *szSource );
この関数内で有効で、プログラムが終了するまで続くっぽい(?)
管理者は理解できないので、これについてわかっておわれる人が
いれば、アドバイスお願いします。お手数をおかけしてすいません
sitemaster is AlleL
linktoair@geocities.co.jp
Copyright (C) since 1999