函数内で宣言された変数の値は, その函数の中だけで変更可能で 他の函数から直接その変数の値を変化させる事はできません. (この授業では敢えてやりませんが, 間接的な形で変更する 事は可能です.) 函数の中で宣言された変数は, その函数の中だけに生きているのです. そういう意味で函数内の 変数の事を, 局所変数(local variable)といいます.
これに対して, 全ての函数の外で変数を宣言する事もできます. 函数の外で宣言するとどうなるかというと, 全ての函数で その値を参照したり, 変更したりすることが可能になります. つまり, その変数は, プログラム全体で生きているわけです. このような変数の事を, 大域変数(global variable)といいます.
次のプログラムでは, hensu
という変数が大域変数
で定義されています. main()
でhensu
を 1に
初期化してますが, addone
でその値に 1を加えています.
従って, addone
の後の hensu
の値は 2になります.
なお, 値を返さない函数のプロトタイプ宣言では, 返り値を書く 部分を void とします.
/* File name 11-1.c */ #include <stdio.h> int hensu; void addone(); main() { hensu=1; addone(); printf("hensu=%d\n", hensu); } void addone() { hensu=hensu+1; }
次のプログラムでは, hensu
は main
の中で定義されています.
函数 addone
は int型の引数を持ち, その引数に 1を加えています.
従って, addone
でhensu=
「addone
の引数」の値は,
2になります. しかし, addone
を実行しても, main()
の
hensu
は 1のままです. これは, 函数に引数として値を渡すときに,
その値がコピーされて(通常の紙のコピーと同じように考えて下さい)渡されます.
コピーの値を変えても(コピーされた紙に何かを書き込んでも)元の値
(コピーの原本)は変化しません. C言語では, 函数の引数渡しは,
このように「値のコピー」が渡されると, 決められています.
これは, C言語の特徴であり,
値による呼び出し(call by value)
といわれています.
/* File name 11-2.c */ #include <stdio.h> void addone(int hensu); main() { int hensu=1; addone(hensu); printf("In main, hensu=%d\n", hensu); } void addone(int hensu) { hensu=hensu+1; printf("In addone, hensu=%d\n", hensu); }
このように「局所変数は直接他の函数から変えられない」ということは, とても重要な事ですので覚えていて下さい. なぜこのようになっているかというと,「間違いの無いプログラムを組むには, この方が便利」だからです. プログラムというのは突き詰めれば, データの変形(情報科学的な言葉でいうと, 計算機の状態遷移)を記述 する事に他なりません. 1つの変数が, 多くの場所で変化させられるように プログラムを組むと, 間違いの発見が大変になるからです.