連載
» 2014年12月26日 11時00分 公開

完全マスター! 組み込みC言語プログラミング(16):【問題15】変数を制する者は関数を制する (2/3)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]

外部変数と再帰関数への理解を深める

 今回はC言語のテクニックとして、新たに外部変数と再帰を使っています。

 外部変数(またはグローバル変数)とは関数の外で宣言される変数を言い、convert.cでは3行目と4行目の

int base;
char *p;

 で宣言された、型intのbaseと、型「charへのポインタ」のpが外部変数です。外部変数はプログラムのどこでも使用できます。

 ちなみに、関数の中で宣言される変数は内部変数(またはローカル変数)と言います。例えば14行目の

int n, b;

 で宣言された、型intのnとbは内部変数で、mainの中でのみ使用可能です。

 一方、再帰とは関数の中から自分自身を呼び出すことを言います。convert.cでは_convertが再帰になっていて、37行目の

if (num >= base) _convert(num / base);

 は、_convertの関数定義でありながら、_convertを呼び出しています。

変数のスコープ

 スコープとは変数の使用可能な範囲、すなわち有効範囲のことです。変数は宣言された場所によって、使えたり(見える)、使えなったり(見えない)します。

 convert.cでの変数のスコープを図示すると、次の様になります。

photo

 外部変数であるbaseとpのスコープは、青色で示す範囲です。baseとpはプログラムの終わりまで使用可能で、このようなスコープを「ファイルスコープ」と呼びます。

 ファイルスコープを持つ変数は、ソースプログラムのどこからもアクセス可能です。ですから関数間のデータのやり取りは、引数と戻り値、そして外部変数を通じて行うことができます。

 内部変数は関数の中しか使うことができません。例えばmainの中で宣言されるn、b、strのスコープは、mainの関数定義の終わりの波カッコ(20行目の})までとなります。実はC言語では波カッコ()で囲んで複合文(ブロック)を構成しますが、始まりの波カッコ({)の直後であれば変数宣言することができます。そこで宣言された変数は、対応する終わりの波カッコ(})までのスコープをもち、このようなスコープを「ブロックスコープ」と呼びます。

 ブロックスコープを持つものは、複合文内で宣言された変数だけではありません。関数の仮引数もブロックスコープを持ちます。例えばconvrtにはs、num、bの3つの仮引数がありますが、使用できる範囲はconvertの終わりの波括弧(31行目の})までとなります。

 内部変数は外部変数と同じ名前を付けることができます。すると内部変数が妨げになって、同じ名前の外部変数のスコープはなくなります。

Copyright © ITmedia, Inc. All Rights Reserved.