[時間割:C言語]『はじめてのC言語完全入門』その8
2008/10/25 22:49 posted by kunkichi
今週の頭は少しサボっちゃいましたが、気を取り直して。サボりの元凶となったのは Touch Diamond を買ったから(笑)ですが、遊びのために買ったんじゃない、ということを証明するために早速、金曜日の会社帰りに外で勉強しました。やっぱり外ははかどるな〜、3章一気に進んじゃったし。
ということで、木・金のアップです。まずは『C言語』の方から。
はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
posted with amazlet at 08.08.19
塚越 一雄
技術評論社
売り上げランキング: 420963
技術評論社
売り上げランキング: 420963
関数
- Cの場合、関数の定義には、以下が必要。
- 関数名
- 関数の型。返り値の型を決める必要がある。
- 引数。
- 関数値。いわゆる、返り値。
なんといっても、「型」が必要ってところが、PerlとかPHPとかとの最大の違い。
- 返り値がない場合は、型にvoid を指定する。でもってreturnは値を指定しないか、returnそのものを省略できる。
- ただし、void型関数の途中で終了する場合は、returnを使う。
- 引数なしの場合は、voidを使う。voidを使わずに()だけで書いた場合は、引数がないのではなく、コンパイラが引数のチェックをしない、という意味になるので注意。
- 関数を定義する場所は、
- 関数が呼び出される場所よりも前に書く(Pascal方式)。シェルスクリプトはこっち。
- 関数が呼び出される場所よりも後に書く(C方式)。ただしこの場合は、呼び出される前にプロトタイプ宣言が必要。
- プロトタイプ宣言は、関数の使い方のチェックを行うためのもの、と言える。
- static変数とauto変数の違い。
- auto変数は、関数呼び出し時に初期化され、関数終了時に消滅する。
#include <stdio.h>実行結果:
void auto_hensuu();
int main()
{
auto_hensuu();
printf("----------\n");
auto_hensuu();
return 0;
}
void auto_hensuu()
{
int i,num = 0;
for(i=0; i<10; i++){
printf("auto関数 %2d 回目: num = %d\n", i +1 , num );
num += 10;
}
return;
}$ ./kansuu2回目の関数呼び出し時に変数が初期化されている。
auto関数 1 回目: num = 0
auto関数 2 回目: num = 10
auto関数 3 回目: num = 20
auto関数 4 回目: num = 30
auto関数 5 回目: num = 40
auto関数 6 回目: num = 50
auto関数 7 回目: num = 60
auto関数 8 回目: num = 70
auto関数 9 回目: num = 80
auto関数 10 回目: num = 90
----------
auto関数 1 回目: num = 0
auto関数 2 回目: num = 10
auto関数 3 回目: num = 20
auto関数 4 回目: num = 30
auto関数 5 回目: num = 40
auto関数 6 回目: num = 50
auto関数 7 回目: num = 60
auto関数 8 回目: num = 70
auto関数 9 回目: num = 80
auto関数 10 回目: num = 90 - static変数は、プログラム実行時に初期化され、プログラム終了時に消滅する。
#include <stdio.h>実行結果:
void static_hensuu();
int main()
{
static_hensuu();
printf("----------\n");
static_hensuu();
return 0;
}
void static_hensuu()
{
int i = 0;
static int num = 0;
for(i=0; i<10; i++){
printf("static関数 %2d 回目: num = %d\n", i +1 , num );
num += 10;
}
return;
}
$ ./kansuu22回目の呼び出し時に1回目の処理終了時の変数をそのまま引き続き使用している。
static関数 1 回目: num = 0
static関数 2 回目: num = 10
static関数 3 回目: num = 20
static関数 4 回目: num = 30
static関数 5 回目: num = 40
static関数 6 回目: num = 50
static関数 7 回目: num = 60
static関数 8 回目: num = 70
static関数 9 回目: num = 80
static関数 10 回目: num = 90
----------
static関数 1 回目: num = 100
static関数 2 回目: num = 110
static関数 3 回目: num = 120
static関数 4 回目: num = 130
static関数 5 回目: num = 140
static関数 6 回目: num = 150
static関数 7 回目: num = 160
static関数 8 回目: num = 170
static関数 9 回目: num = 180
static関数 10 回目: num = 190
- auto変数は、関数呼び出し時に初期化され、関数終了時に消滅する。
- 値を返さないvoid型関数は値を取るような処理では使えない。結果を代入するとか、結果を出力するとか(もちろん関数内で出力することはできる)。逆に値を返す関数は、値を取らない処理でも使える。
- べき乗を計算するpow()を使う場合は、math.hをインクルードする。
- 引数を取る関数は、仮引数を定義しなければいけない。その場合、仮引数の型も合わせて定義する。
- プロトタイプ宣言している場合は、そちらにも引数をちゃんと指定すること。
スコープ
- 関数内の変数は関数内にのみ限定される(ローカル変数)。
- 実際には「ブロック」内、つまり{}で囲まれた範囲内に限定されているのがローカル変数。
- 関数の外側の変数は、関数から見た場合にはグローバル変数となり、参照可能。
- 変数名もブロック内に限定されるので、他の関数内で同じ変数名が使用されていても衝突しない。
- ただし、グローバルな変数名と同じ名前にした場合、関数内ではローカル変数が優先される。
- グローバル変数はファイルスコープ。
配列
- 配列にも型の概念がある。すなわち、同じ型のデータしか入れれない。異なる型のデータを入れるのは構造体。
- 配列は、基本の型とは異なるユーザ定義型の一つ。
- 配列を宣言するには、型・配列名・サイズ(要素数)をあらかじめ定義する。
int ary[10] - 初期値を与えることもできる。
int ary[] = { 1, 2, 3 };この場合はサイズの指定は不要(自動的に初期値の個数がサイズとなる) - 配列の要素へのアクセスは、インデックスを使う。
x = ary[0]; - 配列全体のメモリ量を求めるには 配列に対して sizeof を使う。
sum = sizeof ary; - 配列要素の単体メモリ量を求めるには 配列のインデックス0 に対して sizeof を使う。
each = sizeof ary[0] - つまり、全体メモリ量を単体メモリで割ると、配列の要素数を求めることができる。
num = sizeof ary / sizeof ary[0];forループの上限値等に設定する場合はこれをつかうとよろし。 - forループの脱出にもbreakが使える。
- ループの脱出にはbreakを使う。
- 配列はあらかじめサイズを指定しておかないといけないため、途中でサイズが大きくなった場合に対応できない。こういう場合は動的メモリが必要となる。
ふぅ、たくさん進んだ分、アウトプットも多くなってしまいましたが、これで教科書の残り3分の1まで来ました。やっと終わりが見えてきたのでがんばります。次はいよいよ「ポインタ」です!







コメント&トラックバック
トラックバックURL: