I ♥ WordPress

[時間割:C言語]『はじめてのC言語完全入門』その8
2008/10/25 22:49 posted by kunkichi

今週の頭は少しサボっちゃいましたが、気を取り直して。サボりの元凶となったのは Touch Diamond を買ったから(笑)ですが、遊びのために買ったんじゃない、ということを証明するために早速、金曜日の会社帰りに外で勉強しました。やっぱり外ははかどるな〜、3章一気に進んじゃったし。

ということで、木・金のアップです。まずは『C言語』の方から。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 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;
      }
      実行結果:$  ./kansuu
      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
      2回目の関数呼び出し時に変数が初期化されている。
    • 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;
      }
      実行結果:$ ./kansuu2
      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
      2回目の呼び出し時に1回目の処理終了時の変数をそのまま引き続き使用している。
  • 値を返さない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





このページの先頭へ