Sponsored Link
 
>>  Main > Programing > Primary > 0011

D言語入門 第11章 - 変数の寿命

#01 - 基本

今回は…

変数の寿命について説明します。

変数の寿命とは、変数がデータを保っていられる範囲です。
変数の寿命は、基本的には宣言してからブロックの終わりまでが変数の寿命です。
ブロックというのは "{" と "}" に囲まれている部分こことです。

今回のミソ

  • 変数の寿命は基本的には宣言してからブロックの終端まで
  • "{" と "}"に囲まれたところを、ブロックという

サンプルコード

import std.stdio;

int main(char[][] args)
{
    // ブロック1開始
    
    // ポインタを宣言
    int* p;
    
    // 変数aを宣言
    int a=10;
    
    // pはaをさすポインタ
    p = &a;
    writefln(*p);
    
    {
        // ブロック2開始
        
        // ブロック1の中にあるからaの中身は大丈夫。
        // だから、*pでアクセスしてOK
        writefln(*p);
        
        // 変数bを宣言
        int b=100;
        
        // pがさしているものをbにする
        p = &b;
        
        // ブロック2の中にあるからbの中身は大丈夫。
        // だから、*pでアクセスしてOK
        writefln(*p);
        
        // ブロック2終了
    }
    
    // すでに終了しているブロック2の中にあるからbの中身はもう使ってはダメ。
    // だから、*pでアクセスしてはいけません。
    // 何が起こるかわかりません。
    // 最悪PCのフリーズだけではおさまらなくなることも…
    writefln(*p); // エラーにはならないけれど、NG!
    
    return 0;
    // ブロック1終了
}

実行結果

10
10
100
(何が起こるかわかりません。もしかしたら100ということもあるかもしれませんが…)

まとめ

上記の例では、アクセスしてはいけないポインタにアクセスしています。
うまいことこれが成功してしまうこともあるかもせません。
でも、これは危険なのでやめたほうがいいと思います。
また、このように使ってはいけないポインタに無理やりアクセスして起こる例外を
Null Pointer Exception
通称「ぬるぽ」
とか言ったりしますね。ガッ!!

#02 - static

今回は…

ブロックの終端で終わってしまう変数とはちがい、ブロックが終了しても値が持続するものを紹介します。
static というのが付いている変数がそうです。
これを静的変数と言います。
この静的変数は、プログラムが開始されたところからプログラムが終了するまでずっと寿命が続きます。
なので、先のようにアクセスしてはいけないというわけではなくなります。

今回のミソ

  • 静的変数を作るには変数にstaticをつける
  • 静的変数の寿命はプログラム開始時から終了時まで

サンプルコード

import std.stdio;

int main(char[][] args)
{
    // ブロック1開始
    
    // int*型の変数 p を宣言
    int* p;
    while (1)
    {
        // ブロック2開始
        {
            // ブロック3の開始
            
            // 静的変数 x の宣言
            static int x=0;
            
            // p はxを指し示すポインタ
            p = &x;
            
            // x の中身を確認
            writef("x = ");
            writefln(x);
            
            // x を1増やす。
            // 一見意味がないように見えるけど、
            // x は静的変数なので、次にここを通った時に1増えている。
            writefln("x++");
            x++;
            
            // x が10を超えていたら終了します
            if(x > 10){
                break;
            }
            
            // ブロック3の終了
        }
        
        // 普通の変数であればブロック3は終了しているのでここで *p を使うのはダメ。
        // だけど、静的変数の寿命はプログラムが終了するまで続くので、
        // *p としてもOK
        writef("*p = ");
        writefln(*p);
        
        // ブロック2終了
    }
    
    return 0;
    // ブロック1終了
}

実行結果

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
次回はスコープについて語ります。
変数の寿命とかなり似ていますが若干違いますよ。

さてさて、宿題の予想ついたら次にいきましょう~

ページトップ / 目次 / 次へ
Copyright©SHOO All rights reserved. / LastModified : 2007/12/12(水)[05:52:29]