[前へ]   [目次へ]   [次へ]

構造体(C/C++)


今回から構造体についてです。

構造体は複数の変数をひと固まりにして新しい型として定義するものです。
構造体はC++で仕様が大きく拡張されているため、C言語とC++での構造体はかなり仕様が異なります。
(C++の仕様はC言語の上位互換であるため、C言語でできた記述がC++でできないということはありません)

なので、今回はC言語部分のみの構造体の解説を行います。
C++で拡張された部分はほとんどがC++の「クラス」と同様の仕様を持っているので、
C++の構造体の解説は「クラス」を解説する時に行うことにします。


さて、構造体を宣言するには struct キーワードを使い、
以下のような構文を用います。

struct 構造体タグ名;

例:構造体 ABC を宣言
struct ABC; 

「構造体タグ名」は宣言する構造体の名前であり、
変数などと同じ命名規則で自由に付ける事ができます。

この形で宣言された構造体は「宣言のみ」された状態になります。
この状態を「不完全型」と呼び、構造体のポインタを作ることはできますが、
構造体を実体化したり、中身を参照することはできません。

また、C言語では「型名」と「構造体タグ名」は明確に区別されており、
「構造体タグ名」を「型名」として扱うには typedef を行う必要があります。(後述)


そして実際に構造体を使用するためには以下のような構文を用いて定義します。

struct 構造体タグ名{定義内容}実体名;

例:構造体 ABC を定義し、中身として int 、 char[10] 、 int 型を持たせる
<  1>
<  2>
<  3>
<  4>
<  5>
struct ABC{
   
int a;
   
char b[10];
   
int c;
}; 

「構造体タグ名」は先ほどと同様、定義する構造体の名前です。
宣言のみ行った構造体がある場合は、同名の「構造体タグ名」で定義することにより、
利用可能な状態になります。
また、関数の定義の時と同様に、定義は宣言を兼ねるため、定義のみ行っても問題ありません。

「定義内容」には変数の宣言を任意の数行うことができます。
この中の変数宣言の構文は基本的には通常の変数宣言と同じです。
ただし auto や register などいくつかの装飾は指定できません。
また、 static はC言語では使えず、C++では特殊な解釈をされます。

「実体名」はその場で定義する構造体オブジェクト名です。
これを書いた場所でそのまま「構造体オブジェクト」を定義する時に使用します。
また「実体名」は , で区切ることにより複数書くことができます。
しかし構造体定義は通常ヘッダーファイルで行うことやグローバルに定義することが多いことから、
その場で定義することはあまりありません。

この定義構文では、「構造体タグ名」と「実体名」は省略することができます。
「構造体タグ名」を省略した場合は「無名構造体」と呼ばれ、
原則としてその場で定義したオブジェクト以外で使うことができなくなります。
(他の型宣言中に定義している場合はこの限りではありません)
単独で定義しながら、「構造体タグ名」と「実体名」を両方省略すると全く使用できなくなります。

また、一番最後の ; を書かないとエラーになることを覚えておいてください。
関数定義だと不要なため忘れがちですが「実体名」の区別のためだと思われます。


C言語では 第6回 でも書いた通り、構造体型のオブジェクトを定義するには
いちいち struct を指定しなければなりません。
ところがこれは結構煩わしいため、 typedef して struct なしで指定できるようにすることが良く行われます。
この場合の定義は以下のように行います。

typedef struct 構造体タグ名{定義内容}定義型名;

例:先ほどの構造体 ABC を ABCD という型名で定義する
<  1>
<  2>
<  3>
<  4>
<  5>
typedef struct ABC{
   
int a;
   
char b[10];
   
int c;
}ABCD; 

最後が「実体名」と紛らわしいのですが、この場合は「型名」になります。
こちらも「型名」は , で区切ることで複数定義することができます。



上記のような方法で「構造体型」を定義することができ、
「構造体タグ名」または「 typedef した型名」を使って指定することができます。

一方で、ここで定義したのはあくまで「型」であり、
これだけではその中身に対応するメモリも確保されず、中身にアクセスすることもできません。
「型」を定義するということは、その型の「設計図」を作ったということに注意してください。

実際に使うには「構造体型」のオブジェクトを定義して実体化する必要があります。
(ここでいう「オブジェクト」は以前の「変数」と大体同じような感覚のものです)
なお、構造体型のオブジェクト定義方法は今までの変数定義の「型名」のところに構造体型を指定するだけです。


次回は構造体型オブジェクトの使い方についての予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2012/01/01