2 構造体の定義

   2.2 変数の定義と値の操作
 構造体を定義しただけでは"複数のデータをひとかたまりのデータとして扱います" ということを宣言しているにすぎません。前の例では"personal_tag"という構造体タグはそのメンバとして文字型の配列を2つと浮動少数型の変数を1つ持つ構造体であるということを定義しているだけです。
構造体を使うには定義した構造体タグの型を持つ変数を定義しなければなりません。定義した変数は構造体の持つメンバの値を持つことができます。

 さきほど定義した構造体タグ "personal_tag" 型の変数を "pd_a" と "pd_b" という名前で定義するには次のいずれかの方法で行います。
  1. 構造体の定義と変数の定義を別に行う方法
    struct personal_tag {    /* 個人タグ */
      char name[10];       /* 名前 */
      char address[20];    /* 住所 */
      double phone;        /* 電話番号 */
    };
    
    struct personal_tag pd_a, pd_b; /* 個人タグの変数の定義 */
    
  2. 構造体の定義と変数の定義を一緒に行う方法
    struct personal_tag {    /* 個人タグ */
      char name[10];       /* 名前 */
      char address[20];    /* 住所 */
      double phone;        /* 電話番号 */
    } pd_a, pd_b;               /* 構造体の定義 */
    
  3. 構造体の定義と変数の定義を一緒に行う方法(構造体タグは定義しません)
    struct {
      char name[10];     /* 名前 */
      char address[20];  /* 住所 */
      double phone;      /* 電話番号 */
    } pd_a, pd_b;             /* 構造体の定義 */
    
    この場合は同じ型の構造体はここでしか定義できません。
 これで構造体タグ "personal_tag" 型の変数 "pd_a" と "pd_b" が定義できました。したがって変数 "pd_a" と "pd_b" は文字列型の配列2つと浮動小数型1つのデータを持つことができます。また、構造体を定義すると各メンバ用のデータ領域がメモリ上に連続して確保されます。

構造体のイメージ

 メンバの値の操作は次の方法で行うことができます。
  1. 初期化
    構造体の初期化は変数を定義したときに次のように行うことができます。
    struct personal_tag {    /* 個人タグ */
      char name[10];       /* 名前 */
      char address[20];    /* 住所 */
      double phone;        /* 電話番号 */
    };
    
    /*** 個人タグの変数の定義・初期化 ***/
    struct personal_tag pd_a = {"A-san", "F-city", 9876543210},
       pd_b = {"B-san", "G-city", 9876543211},
       pd_c;
    
  2. メンバ値の参照・代入
     各メンバの値は "変数名"."メンバ" のように構造体の変数名とメンバ名を . (ピリオド)でつなげることで参照できます。初期化の説明のところで定義した"pd_c" という変数に対して、strcpy()関数(ヘッダファイル string.hが必要)を用いて文字列代入を行うことができます。数値はそのまま=で代入できます。
    strcpy(pd_c.name, "C-san");
    strcpy(pd_c.address, "H-city");
    pd_c.phone = 9876543212;
    
    とすることで各メンバに値が代入できます。また次のようにすることで値を表示することができます。
    printf ("name: %s\n", pd_a.name);
    printf ("address: %s\n", pd_a.address);
    printf ("phone: %.0f\n", pd_a.phone);
    
  3. 構造体同士の代入
     配列では配列同士の値の代入はできませんでしたが、構造体は構造体同士の値の代入ができます。つまり先ほど定義した変数 "pd_a" のメンバの値全てを変数 "pd_c" に代入するには
    pd_c = pd_a;
    
    で可能です。 ただし、構造体のメンバの形が同じでも構造体タグが違うもの同士では代入はできませんので注意してください。次のようなプログラムはエラーがでます。

    #include <stdio.h>
    
    int main(void){
    
      struct personal_tag {   /* 個人タグ */
         char name[10];      /* 名前 */
         char address[20];   /* 住所 */
         double phone;       /* 電話番号 */
      };
    
      /*** 構造体の初期化 ***/
      struct personal_tag pd_a = {"A-san", "F-city", 9876543210};
    
      struct {
         char name[10];     /* 名前 */
         char address[20];  /* 住所 */
         double phone;      /* 電話番号 */
      } pd_b;                      /* 構造体の定義 */
    
      pd_b = pd_a;
    };
    

2003年2月25日 17:17 更新