C言語講座 - 4 関数

関数は今まで使ってきた main関数のようなものです。 関数には元々用意されている「ライブラリ関数」もありますが(printf scanf など)、 プログラムが複雑になってくるにつれ、自分で目的に合わせて作る関数が専ら基本になります。


/* 関数宣言 */
void print(int i);

/* 関数定義 */
void print(int i)
{
	static int count;
	count++;
	
	printf("%d : %d\n",count,i);

	return;
}

関数は、「返り値の型」「名前」「引数リスト」「関数本体」で構成されるので自分で作るときは全て自分で指定します。 この場合、返り値の型は void なので返り値は無しで、名前は print、引数は int型を一つです。中身は {} で囲います。 関数の本体は、printf関数で関数の呼び出された回数と渡された数値を表示するだけです。返り値は void型なのでありません。

自分で作った関数を使うときは、使うところから関数の「宣言」が見えなければいけません。 つまり、main関数から使うならそれよりも上に関数宣言か定義を書けばいいわけです。 ライブラリ関数を使うときに、その関数の宣言が入っているヘッダーファイルをインクルード(#include)するのと同じです。

ところで関数の中に、static というのがついている変数がありますが、これは「静的」という意味で、 変数なら「プログラム開始時に確保されて、プログラム終了時まで保持される」という意味になります。 上の関数の場合、宣言と同時に static なので0で初期化され、その後インクリメント(++)で中身が 1増え、printfで表示されています。 つまり static により、元の数値に戻らずに、前の数値が保持されます。


int global; /* グローバル変数 */

int main(int argc,void *argv[])
{
	auto int local;
	static int s_int;

	print(local);  /* ローカル変数は不定 */
	print(global); /* グローバル変数は 0 */

	print(s_int); /* static は 0 */

	return 0;
}

「記憶クラス」とそれぞれの初期化についても話しておきます。

一番はじめの関数の外にある変数を、「グローバル変数」といいます。 これはどの関数からも見える位置にあるので使用でき、又中身は常に保持されています。

一方、関数の中の変数は「ローカル変数」と呼ばれます。 auto とありますが、これはローカル変数(自動的)だということを指定するものです。 しかし使わなくても関数の中なら自動的にローカル変数になるので普通は使いません。 だからといって関数の外ではローカル変数にならないので使用できません。(じゃあ何故あるんだろう?)

さて、話はそれましたが、static を使えば 静的変数 になりグローバルのような変数を関数の中で作ることが出来ます。 グローバル変数と違うのは、この関数の中でしか使えないということです。そして中身はプログラム終了まで保持されます。 又、グローバル変数に staticを使うと、他のファイルから参照できなくなるという効果がでます。(後述)

最後に初期化についてです。 つまり宣言して何も代入しなかったらどうなるか?ということです。 この場合、「グローバル変数」と「静的変数(static)」は「自動的に 0 で初期化」されます。 そして「ローカル変数」は「不定値」になります。つまりローカル変数は何か代入しないといけないわけです。

おまけ。registerという記憶クラスもありますが、意味はレジスタに積極的に入れる、ということです。 でも今では最適化とかいろいろあるので下手にいじるよりは何もしない方がいいと思います。

もうひとつ追加。 グローバル変数と、ローカル変数で全く同じ名前の変数があったらどうするか? この場合、ローカル変数の方が優先順位が高くなります。ではグローバル変数を使用したいときは? このときは、「スコープ解決演算子」をつかい、「::グローバル変数名」とすればOKです。

Download 今回のソースDownload


★TOP★

Copyright(C) へぽぽ