D言語入門 第11章 - 変数の寿命
#01 - 基本
今回は…
変数の寿命について説明します。
変数の寿命とは、変数がデータを保っていられる範囲です。
変数の寿命は、基本的には宣言してからブロックの終わりまでが変数の寿命です。
ブロックというのは "{" と "}" に囲まれている部分こことです。
今回のミソ
- 変数の寿命は基本的には宣言してからブロックの終端まで
- "{" と "}"に囲まれたところを、ブロックという
サンプルコード
import std.stdio;
int main(char[][] args)
{
int* p;
int a=10;
p = &a;
writefln(*p);
{
writefln(*p);
int b=100;
p = &b;
writefln(*p);
}
writefln(*p);
return 0;
}
実行結果
10
10
100
(何が起こるかわかりません。もしかしたら100ということもあるかもしれませんが…)
まとめ
上記の例では、アクセスしてはいけないポインタにアクセスしています。
うまいことこれが成功してしまうこともあるかもせません。
でも、これは危険なのでやめたほうがいいと思います。
また、このように使ってはいけないポインタに無理やりアクセスして起こる例外を
Null Pointer Exception
通称「ぬるぽ」
とか言ったりしますね。ガッ!!
#02 - static
今回は…
ブロックの終端で終わってしまう変数とはちがい、ブロックが終了しても値が持続するものを紹介します。
static というのが付いている変数がそうです。
これを静的変数と言います。
この静的変数は、プログラムが開始されたところからプログラムが終了するまでずっと寿命が続きます。
なので、先のようにアクセスしてはいけないというわけではなくなります。
今回のミソ
- 静的変数を作るには変数にstaticをつける
- 静的変数の寿命はプログラム開始時から終了時まで
サンプルコード
import std.stdio;
int main(char[][] args)
{
int* p;
while (1)
{
{
static int x=0;
p = &x;
writef("x = ");
writefln(x);
writefln("x++");
x++;
if(x > 10){
break;
}
}
writef("*p = ");
writefln(*p);
}
return 0;
}
実行結果
x = 0
x++
*p = 1
x = 1
x++
*p = 2
x = 2
x++
*p = 3
x = 3
x++
*p = 4
x = 4
x++
*p = 5
x = 5
x++
*p = 6
x = 6
x++
*p = 7
x = 7
x++
*p = 8
x = 8
x++
*p = 9
x = 9
x++
*p = 10
x = 10
x++
まとめ
というわけで、静的変数のデータには、ブロックを越えてアクセスしても大丈夫ですよ、というお話でした。
静的変数に対し、何もつけない場合のそれは自動変数と言います。
他にも外部変数なんてのもありますが、その辺は割愛します。
#summary - まとめ
第11章のミソ
- 変数の寿命は基本的には宣言してからブロックの終端まで
- "{" と "}"に囲まれたところを、ブロックという
- 静的変数を作るには変数にstaticをつける
- 静的変数の寿命はプログラム開始時から終了時まで
宿題
静的変数を使ったらいい場合と悪い場合を考えましょう。
コメント
まぁ、特に今回はコメントはありません。
なんというか、静的変数に関してもほとんど使わないのでプログラミングすることは十分可能なので…というか、個人的にはあまり使わないので、頭に入れておくくらいでいいんじゃないかなと思います。
その割にはえぐい宿題だw
次回はスコープについて語ります。
変数の寿命とかなり似ていますが若干違いますよ。
さてさて、宿題の予想ついたら次にいきましょう~
ページトップ /
目次 /
次へ