C言語学習log:いろいろな型

やさしいC 第3版 』Lesson11は「いろいろな型」ということで、「構造体」「共用体」「列挙」を学習します。

構造体

構造体の基本

構造体は、異なる型の値をまとめて新しい型とする機能を持っていて、以下のように宣言します。

struct 構造体型名{
 型名 識別子;
 型名 識別子;
 ・・・
};

構造体を宣言すると、新しい型としてコード内で使用することができるようになり、その構造体の変数は

構造体型名 構造体変数名;

のように宣言します。

構造体型の変数(構造体)を宣言すると、その中に変数を格納することができるようになり、その変数をメンバと呼びます。構造体のメンバにアクセスするためには、ドット演算子(.)を使います。

構造体変数名.メンバ

構造体の記述の仕方

構造体型はtypedefを使って独自の型名をつけることができます。

typedef 型名 識別子;

構造体を初期化するには

構造体型名 構造体変数名 = {値, 値, ・・・};

と記述します。

構造体には同じ型の構造体を代入することができ、代入するとメンバがそれぞれコピーされて値が格納されます。

構造体のサイズ

構造体で、ビットを指定したメンバのことを「ビットフィールド」と呼び、以下のように記述します。

struct 構造体型名{
 型名 識別子 : ビット数;
 型名 識別子:ビット数;
 ・・・
};

構造体の応用

構造体は、関数の引数として用いることができ、構造体を引数とした場合も「値」が渡されます。ただし、構造体へのポインタを引数として使うと、引数を実質的に参照渡しとすることになります。この場合、構造体へのポインタを使って各メンバにアクセスする処理を、アロー演算子(->)を使って以下のように記述すると便利です。

構造体へのポインタ->構造体メンバ

構造体は通常の方と同じように扱えるので、構造体の配列を作成することができます。

また、構造体のメンバとして、同じ型へのポインタをメンバとし、そのポインタによって同じ型の構造体を指し示すことができるようになります。そのようにして、構造体を数珠つなぎにして管理する(リストを作成する)ことができます。

共用体

共用体型は以下のように宣言し、共用体型のメンバは同時に値を記憶できるのではなく、全体で1つしか値を記憶することができないという特徴があります。

union 共用体型名{
 型名 識別子;
 型名 識別子;
 ・・・
};

列挙

列挙型は識別子を値として格納できる型のことを言います。