TPY ENGINEERING VLOG

TPY ENGINEERING VLOG(C,JAVA)

*C言語* 〜27時限目〜 変数について細かく・・・

〜目次〜

 

 

 

ローカル変数の名前を重ねた場合

変数の名前と宣言位置には注意してください。

同じ関数内のローカル変数には同じ名前をつけることはできません。

ただし、

異なる関数内で宣言した、

ローカル変数には同じ名前をつけることができます。

同じ名前がついていても、

異なる関数内のローカル変数は、

別の変数になります。

 

グローバル変数の名前を重ねた場合

グローバル変数とローカル変数は、

同じ名前をつけることができます。

名前が重複した場合には以下のようになります。

f:id:YuyaTerayama:20180910233439p:plain

ローカル変数を宣言したfunc( )関数内での、

「a++;」などという記述をすると、

それはローカル変数aのことをさします。

つまり、func( )関数内でインクリメントされるのは、

ローカル変数aということになります。

一方で、main( )関数内でインクリメントされるのは、

グローバル変数aになります。

func( )関数内ではローカル変数により、

グローバル変数の名前は隠されるようになっています。

 

ローカル変数のバリエーション

ローカル変数は、

関数の先頭だけでなく、

for文やif文などのブロックの先頭で宣言することもできます。

関数の仮引数もローカル変数の一種です。

ローカル変数は、

それを宣言したブロックだけで通用する変数になります。

ブロックの内側と外側で変数名が重複した場合には、

内側の変数の名前が優先されます。

 

変数の記憶寿命について

変数や配列は、

プログラムを開始してから終了するまで、

ずっと値を記憶してる訳ではありません。

変数を宣言すると、

まず値を記憶するための箱がメモリ内に準備されます。

このことを、

メモリが確保される

と呼ぶことがあります。

そのあと、変数に値を格納したり出力したりして、

利用するわけだが、

最後に箱が廃棄されることにより、

メモリがまた別の用途に使われるようになります。

このことを、

メモリを解放する

と呼ぶことがあります。

変数の箱が存在し、値を記憶していられる期間のことを、

記憶寿命

と呼びます。

変数がどのような記憶寿命を持つかは、

変数の宣言位置にも関係しています。

通常のローカルの変数の場合、

  1. 関数内で宣言された時に、変数の箱がメモリに準備され
  2. 関数が終了すると、箱が廃棄されメモリが他の用途に使われるようになる

という流れをたどります。

つまり、通常のローカル変数は、

宣言されてから関数が終了するまでの間だけ、

値を格納しておくことができます。

グローバル変数の場合、

  1. プログラム全体の処理が始まる前に、一度だけメモリが確保され
  2. プログラム終了時にメモリが解放される

という流れをたどります。

つまり、グローバル変数は、

プログラムの開始から終了までの間、

ずっと値を格納しておくことができます。

変数の一生を確かめるために、以下のコードを入力してください。

sample61.c

f:id:YuyaTerayama:20180911001329p:plainーsample61の実行画面ー

変数aは0、変数bは0、変数cは0です。

変数aは1、変数bは0、変数cは1です。

変数aは2、変数bは0、変数cは2です。

変数aは3、変数bは0、変数cは3です。

変数aは4、変数bは0、変数cは4です。

func( )関数は変数a,b,cの値を出力し、

1つずつインクリメントしている関数です。

グローバル変数aはプログラムの開始から終了まで値を

記憶しているので、1つずつ値が増えていく。

一方ローカル変数bは、

関数が呼び出されるたびに最初に0が格納され、

関数の終了ごとに箱が廃棄されます。

このため、インクリメントをしても

いつも0のままになってしまいます。

 

staticをつけると・・・

通常のローカル変数は関数が終了するまでの、

記憶寿命しかもちません。

ただし、ローカル変数にstaticというキーワードを指定することで、

グローバル変数と同じ記憶寿命を持つようになります。

このようなローカル変数のことを、

静的寿命を持つローカル変数

と呼びます。

staticは、

記憶クラス指定子(storage class identifier)

と呼ばれています。

尚、変数の初期化コードを記述しなかった場合には、

グローバル変数とstaticなローカル変数は、

自動的に0で初期化されるようになっています。

通常のローカル変数を初期化しない場合の初期値は、

特に決まっていません。

 

〜END〜