構造体の配列を渡す

構造体の配列をパラメータとして、関数に渡します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 構造体の配列をパラメータとして関数に渡す方法には、幾通りかの方法があります。
    C言語ではポインタの扱い方が難しく、特に構造体や Object Class のポインタに悩まされている方も多いのでは無いでしょうか。 (^_^;)
    これを機にポインタの基本的な使い方を習得して下さい。
    構造体の配列 seiseki[10] をパラメータとして関数に渡します。
    TSeiseki seiseki[10];
    構造体の配列を定義して、初期値を設定する方法は 構造体の配列 を参照して下さい。
  2. サンプル-1
    1. 構造体の配列 seiseki[10] をパラメータとして、関数 prt() を呼び出します。
      TSeiseki seiseki[10];
      prt(seiseki);
    2. 構造体全体を sei[] で受け取ります。
      sei には、構造体の配列が定義されている先頭のアドレス(ポインタ)が渡されます。
      元の宣言に合わせた形で受け取るので、最も解り易いのでは無いでしょうか。 ヽ(^^ )
      void prt(TSeiseki sei[])
      {
          printf("\n\nprt");
          for(int i=0; i<10; i++)
          {   printf("\n%3d  %-24s %3d %3d",
              i+1,sei[i].m_name,sei[i].m_ten1,sei[i].m_ten2);
          }
      }
      
  3. サンプル-2
    1. 構造体の配列をポインタで受け取る方法です。
      呼び出し側は前回と同じで、受け取り方だけが異なります。
      TSeiseki seiseki[10];
      prt2(seiseki);
    2. 構造体全体のポインタを *p で受け取ります。
      *p の「*」はポインタを意味し、構造体の配列が定義されている先頭のアドレスが渡されます。
      *p で受けたときは (p+i)->m_name のように i 番目の領域を参照します。
      void prt2(TSeiseki *p)
      {
          printf("\n\nprt2");
          for(int i=0; i<10; i++)
          {   printf("\n%3d  %-24s %3d %3d",
              i+1,(p+i)->m_name,(p+i)->m_ten1,(p+i)->m_ten2);
          }
      }
      
  4. サンプル-3
    1. 構造体の配列の3番目(添え字は 2)をポインタとして渡してみましょう。
      3番目(添え字は 2)のポインタを渡すときは &seiseki[2] のように書きます。
      「&」は領域のポインタを指定する演算子です。
      TSeiseki seiseki[10];
      prt3(&seiseki[2]);
    2. 構造体の配列の3番目(添え字は 2)の構造体ポインタを *p で受け取ります。
      (p+1)->m_name で4番目を、(p+2)->m_name で5番目を参照することも出来ます。
      ただし *p には3番目が設定されているので、構造体の範囲外を参照しないようにして下さい。
      範囲外の領域を参照するとプログラムが落ちたり、意味不明の値になります。
      特に範囲外の領域を壊すと、何が起こるか解らないので注意が必要です。
      void prt3(TSeiseki *p)
      {
          printf("\n\nprt3");
          printf("\n%-24s %3d %3d", p->m_name,p->m_ten1,p->m_ten2);
          printf("\n%-24s %3d %3d", (p+1)->m_name,(p+1)->m_ten1,(p+1)->m_ten2);
          printf("\n%-24s %3d %3d", (p+2)->m_name,(p+2)->m_ten1,(p+2)->m_ten2);
          printf("\n%-24s %3d %3d", (p-1)->m_name,(p-1)->m_ten1,(p-1)->m_ten2);
      }
      
  5. サンプル-4
    1. 構造体の配列の9番目(添え字は 8)の構造体を直接渡します。
      前回と同じような書き方ですが「&」が無いことに注目して下さい。
      TSeiseki seiseki[10];
      prt4(seiseki[8]);
    2. 構造体(厳密には構造体のコピー)を直接 strct で受け取ります。
      strct.m_name のように「.」で参照します。
      今回はポインタでは無く、直接構造体を受け取るので前後の領域は参照できません。
      スタック領域を調べると構造体そのものがスタックに積まれています。
      構造体のサイズが大きくなると効率が悪く、ポインタを渡すようにして下さい。
      void prt4(TSeiseki strct)
      {
          printf("\n\nprt4");
          printf("\n%-24s %3d %3d", strct.m_name,strct.m_ten1,strct.m_ten2);
      }
      

超初心者のプログラム入門(C/C++)