構造体

構造体 は、データ・オブジェクトの順序付けられたグループから構成されます。 配列のエレメントとは異なり、構造体の中のデータ・オブジェクトには、さまざまなデータ型を指定できます。 構造体内の各データ・オブジェクトは、 メンバー またはフィールド です。

C 構造体のメンバーは 、可変的に変更される型を除き、任意のオブジェクト型を持ちます。

最後のメンバーを除く すべてのメンバーは、完了型である必要があります。特別な場合として、複数のメンバーを持つ 構造体の最後のエレメントは、不完全な配列型を持つことができます。この型を柔軟な配列メンバー と呼びます。

C++ C++ では、構造体メンバーは完了型である必要があります。

論理的に関連したオブジェクトをグループ化するには、構造体を使用します。例えば、 あるアドレスの複数のコンポーネントにストレージを割り振るには、次の変数を定義します。

   int street_no;
   char *street_name;
   char *city;
   char *prov;
   char *postal_code;

複数のアドレスにストレージを割り振るには、構造体データ型と、構造体データ型を保持するのに必要な数のみ 変数を定義することによって、各アドレスのコンポーネントをグループ化します。

C++ C++ では、 構造体は、そのメンバーおよび継承が、デフォルトにより public であるということを除けば、クラスと同じです。

次の例では、int street_no; から char *postal_code; までの行は、 構造体タグ address を宣言しています。

      struct address {
                       int street_no;
                       char *street_name;
                       char *city;
                       char *prov;
                       char *postal_code;
                     };
      struct address perm_address;
      struct address temp_address;
      struct address *p_perm_address = &perm_address;

変数 perm_addresstemp_address は、 構造体データ型 address のインスタンスです。 これらの両方には、address の宣言に記述されたメンバーが含まれています。 ポインター p_perm_address は、address という構造体を指し、perm_address を指すように初期化されます。

ドット演算子 (.) 付きの構造変数の名前か、矢印演算子 (->) 付きのポインターとメンバー名を指定することによって、構造体のメンバーを参照します。 例えば、次の例

perm_address.prov = "Ontario";
p_perm_address -> prov = "Ontario";

は、ストリング "Ontario" を指すポインターを、構造体 perm_address にあるポインター prov に代入します。

構造体への参照はすべて、完全修飾されている必要があります。 例では、prov のみでは、4 番目のフィールドを参照することはできません。 このフィールドは、perm_address.prov によって参照する必要があります。

同一メンバーがあるが別の名前が付けられている構造体には、互換性はなく、互いに割り当てることはできません。

構造体は、ストレージを節約するためのものではありません。 バイト・マッピングの直接制御を行う必要がある場合は、ポインターを使用します。

互換構造体

C 構造体の定義ごとに、同じソース・ファイルにある他の構造体型とは異なる 、または互換性のない新規の構造体型を 作成します。ただし、すでに定義された構造体型への参照である型指定子は同じ型です。構造体タグが、参照と定義を関連付け、型名として 効果的に機能します。つまり、以下の例では構造体型 j および k だけが同じ型になります。

struct   { int a; int b; } h;
struct   { int a; int b; } i;
struct S { int a; int b; } j;
struct S k;

関連参照

IBM Copyright 2003