概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 通用範囲(scope)
2006年11月08日 (水) | 編集 |
やはり継続してねーと忘れるなあ。
まあ最近は勉強するほどもないほど忙しかった…のなら仕方ないんだが、それでもしっかり遊んでユグドラクリアしたりリヴィエラ始めたりしている時点で言い訳にはならない。

しっかりしろ俺。

今までにもう十分、恐らくは普通の人以上に遊んできただろう。
そろそろ真面目に働いて、自分というものを磨いて、胸を張って生きていくべきなんじゃないのか。祖母もきっとそれを望んでいる筈だ。

そうだろう?

勿論だ…!




あ、最近GBAのFE封印の剣始めたんでよろしく。
リヴィエラ? 勿論並行して進行していますよ、ええ。

人は何故同じ過ちを繰り返すのか。
変数がプログラムのどの範囲で使用できるかを規定する概念だそうな。
変数っていうと今までは最初に宣言してそのまま最後まで普通に使っていたんだが、実際にはそんな短いプログラムなんてそうそうないので(多分)、プログラム全域で使える変数なのか、それともその関数内でしか使えないものなのかをこの通用範囲(scope)で決めてるってことだな。

変数の通用範囲は、それを宣言する記憶クラス指定子と宣言場所(関数の中か外か)によって決まり、大きく分けると以下の2つになる。
  • プログラムの全域(グローバル)
  • 宣言されている関数の中だけ(ローカル)

お馴染みの単語だな。IPアドレスなんかでも使われるあのグローバルとローカルだ。
ってIPアドレスはローカルじゃなくてプライベートか。
まあ定義は似たようなものなので覚え易いだろう。

関数の外部と関数の内部でstaticを指定して宣言された変数はグローバルな寿命を持ち、そのプログラムの実行中はずっとメモリ上に存在し続けることになる。
逆に、関数の内部でautoまたはregisterで宣言された関数はローカルな寿命を持ち、つまり、その関数の始まりで領域が生成され、その関数の終わりで消滅することになる。

例を見てみよう。

int a;
func1()
{
 static int b;
 int c;
}

func2()
{
 static int b;
 int c;
}

func3()
{
 static int b;
 int c;
}


こんなプログラムがあったとき、関数func1、func2、func3の外部で宣言されている変数a(外部変数と呼ぶそうな)はグローバルであり、各々の関数で参照でき、また、プログラムの始まりから終わりまで同じ場所に存在し続ける。

同様に上で説明したように関数の中でstaticで宣言された変数b(静的変数と呼ぶそうな)もグローバルではあるのだが、これは外部変数とは扱いは少々異なる。
寿命は確かにグローバルでプログラムの始まりから終わりまで同じ場所に存在し続けるのだが、これを参照出来るのは宣言されている関数の中だけなのである。
つまり寿命はグローバルだが、通用範囲としてはローカルってことになるのだ。
全くややこしいがまあ静的変数はそういうものですよと覚えておこう。

で、最後に関数の中で何もつけずに宣言されている変数c(自動変数と呼ぶそうな)だが、これは完璧にローカルであり、その関数内でのみ参照でき、その関数の終わりと同時に領域も失われる。
つまり寿命もローカルで、通用範囲としてもローカルということになる。
こちらは分かり易くて良いな。


んじゃ、本日はここまで。
まとめよう。

変数の通用範囲は関数の内部か外部どちらで宣言されたか、
如何な記憶クラス指定子で宣言されたかによって異なり、
それぞれ外部変数、静的変数、自動変数等と呼ばれる

また、その記憶場所は前回やった静的領域やスタック、レジスタ等になる


以上。
そういや前回やったCPUのレジスタだが、同僚に聞いたところアレはメモリよか早いらしい。
なんてこった。また勝手に騙された。
が、C言語じゃまず使わないらしいのでとりあえずは訳分からんままでもOKだろう。
アセンブラとかいう言語で扱ったりするんだとさ。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。