C言語では、変数に記憶クラスとスコープという考え方があります。
これを、下世話に表現してみましたのが、下の表です。
宣言子 | 分類 | 下世話的表現 |
---|---|---|
auto | 自動変数 | キャバクラのお姉さん。 |
static | 静的変数 | 出張先の愛人。 |
register | レジスタ変数 | 合コンの相手。 |
extern | 大域変数 | 本妻。 |
記憶クラス**extern
は、大域変数を宣言します。
これは言ってみれば本妻**のようなもので、全国どこに行っても存在が消えることはありません。
しかも、どこからも(その気があれば)アクセス可能です。
記憶クラス**static
は、静的変数を宣言します。
これは言ってみれば出張先にいる愛人**のようなもので、存在自体は消えることはありませんが、アクセスできる範囲がその地域に限られています。
アクセスするにはそこに行く必要がありますが、次に訪れた際も忘れずに、別れたときのままにいてくれる、非常に都合のよい存在です。
記憶クラス**auto
は、自動変数を宣言します。
これは言ってみればキャバクラのお姉ちゃん**のようなもので、そこに行かないと会えませんが、行けば自動的に確保されます。
ただし、前のことはすっかり忘れていて、まず同一人物ではありません。
(※キャバクラには行ったことがないので、あくまでも想像です)
最後の記憶クラス**register
は、レジスタ変数を宣言します。
これは言ってみれば合コンの相手**のようなもので、使えるか使えないかは、様々な要因で決まってしまいます。
変数(≒男性)の数に比べて圧倒的にレジスタ(≒女性)は少ないことが多いです。
希望しても適わないことが多く、通常はすでに割り当てが決まっていることが一般的です。
(※合コンには行ったことがないので、あくまでも想像です)
もう少し掘り下げてみましょう。
大域変数と静的変数は、どこに行ってもその存在が消えることはありません。
これに対して、自動変数は関数(≒キャバクラ)内部でのみ存在します。
大域変数と静的変数は、同じ名前ならば原則同じ人物を差します。
これに対して自動変数は、同じ名前でも同じ人物(≒メモリ位置)とは限りません。
これをスコープと言うところから見ると、どうなるでしょうか。
わかりやすく、すべて同じ名前であるとしましょう。
大域変数MidoriがTokyoなどプログラムのどこで宣言されていても、Midoriは日本全国からアクセスできます。
しかし、静的変数MidoriがファイルHokkaidoで宣言されている場合、静的変数MidoriによってHokkaidoでは大域変数Midoriの存在が見えなくなってしまいます。つまり忘れられてしまうのです。
しかし、Hokkaidoに関数Susukinoというキャバクラがあって、もしMidoriという自動変数がいたら、なんと静的変数Midoriも見えなくなってしまいます。つまり忘れられてしまうのです。
Tokyoの大域変数Midoriは、Hokkaidoでは静的変数Midoriの前に霞み、さらにSusukinoのキャバクラ嬢Midoriの前には、それも霞んでしまうのです。
まさに恐るべしといった感じですが、私にはまったく実感の湧かない話です。
何だか疲れる話なので、このへんにしておきましょう。
しかし、無理がありますね、このこじつけには。