【問題15】変数を制する者は関数を制する:完全マスター! 組み込みC言語プログラミング(16)(3/3 ページ)
C言語において変数とはある値を記録して出力する機能を指しますが、「外部変数」と「再帰」の理解を深めることで、関数をより自在に扱えるようになります。
変数の寿命
変数には寿命(正式には「記憶域期間」と呼びます)があります。変数の寿命とは、変数がどの時点で作られて、どの時点で消滅するか、変数の存在する期間を言います。
変数の寿命は、変数の宣言の仕方によって決まります。外部変数の寿命は、プログラムが実行開始から終了するまでで、その変数はプログラムの実行中に存在し続けます。このような変数の寿命を「静的記憶域期間」と呼びます。
一方、内部変数と仮引数は、その関数に制御がある期間存在します。具体的には関数が呼び出され、その関数に制御が移る直前にメモリが割り当てられ、呼び出し元に戻るときにメモリが解放されます。このような変数の寿命を「自動記憶域期間」と呼びます。C言語の変数の寿命は、静的記憶域期間と自動記憶域期間の2種類しかありません。
ではブロックスコープを持つ変数の寿命は自動記憶域期間を持つと言えるかというと、そうではありません。関数内で変数を宣言するとき、staticを付けると、その変数の寿命は静的記憶域期間となります。例えは35行目の
static char NUM[] = "0123456789abcdef";
は、_convert内で宣言されているので、NUMのスコープはブロックスコープとなります。しかしstaticが書かれているので、寿命は静的記憶域期間、すなわちNUMはプログラム実行中存在します。関数が処理を終えてもNUMはメモリに存在し続けるのです。
NUMは「charの配列」ですが初期値が書かれています。ですからNUMはプログラムの開始時にメモリに割り当てられ、開始時に1度だけ初期化されます。
さてこのNUMですが、プログラムでは数値を文字に替えるときに使います。staticを付けないで自動記憶域期間を持つ変数としてもプログラムは正しく動きますが、すると関数が呼び出され制御が移るたびに初期化が行われます。これでは効率が悪いのでstaticを付けたのです。
次回は引き続き再帰とconvert.cのアルゴリズムの解説をいたします。気になる次の問題もあわせてお届けします。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 完全マスター! 組み込みC言語プログラミング(15):【問題14】ポインタなしで関数は語れない
C言語においてポインタは「何か(オブジェクト)を指すもの」ですが、単純に何かを指すだけではなく、関数内のオブジェクトを参照することもできます。ポインタなしに関数は語れないという実例を確認してみましょう。 - 完全マスター! 組み込みC言語プログラミング(14):【問題13】「関数に配列を渡す」とは何か
C言語の関数呼び出しでは、まず引数(実引数)の値を求め、その値を呼び出す関数の仮引数に代入し、その後、関数に制御が移ります。では、「関数に配列を渡す」際にはどうなっているのでしょうか。 - 完全マスター! 組み込みC言語プログラミング(13):【問題12】Cプログラムの見通しが良くなる「関数」を習得しよう!
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。いよいよ関数に話題が移ります。関数を有効に利用できるとプログラムの見通しが良くなるので、ぜひ習得してください。 - 連載記事「イチから作って丸ごと学ぶ! H8マイコン道」
- 連載記事「完全マスター! 電子回路ドリル」
- 連載記事「完全マスター! 電子回路ドリル II」
- 連載記事「完全マスター! 電子回路ドリル III」