構造体、共用体、ビットフィールド:独自の構造を使う
structに基本的なデータ型をまとめる
unionを使って世の中の不確実性に対照する
単純な「はい」「いいえ」が必要ならビットフィールドを使う
TOC
多くのデータを扱わなければいけないこともある
オフィスでの会話
コードを読みやすくする
変更に対処しやすくする
構造体を使って独自の構造化データ型を作成する
固定長である
構造体の中のデータには名前がついている
code:fich.c
struct fish {
const char *name;
const char *species;
int teeth;
int age;
}
// struct fish がデータ型
struct fish snappy = {"スナッピー", "ピラニア", 69, 4};
魚(fish)を表す
.演算子を使って構造体のフィールドを読み取る
Q&A
structは単なる配列なのか?
違うけど似ている
struct変数はstructへのポインタなのか?
いいえ、struct変数は、struct自体の名前です
structはクラスのようなものですか?
にているがstructにメソッドを追加するのはそれほど簡単ではない
構造体を別の構造体に含められる?
構造体はどのように書き換えるの?
このコードは亀のクローンを作っている
Cでは、パラメータは値で関数に渡されます。
構造体へのポインタが必要
(*t).ageと*t.age
(*t).ageと同じ意味でt->ageを使うことができる
Q&A
なぜ値をパラメータ変数にコピーするのか?
コンピュータは関数のパラメータに値を代入することによって関数に値を渡す。
また、代入はすべて値をコピーする
同じ種類のものに異なる型のデータが必要な場合もある
共用体はメモリ空間を再利用できる
code: quantity.c
typedef union {
short count;
float weight;
float volume;
} quantity;
共用体はどのように使うの?
quantity q = {4};
quantity q = {.weight=1.5}
quantity q; q.volume=3.7;
共用体に値を格納した後でその値が何の型だったか、何のフィールドだったかを知ることはできない→enumが使える
enum変数はシンボルを格納する
enum colors {RED, GREEN, PUCE};
ビットレベルで制御したい場合もある
ビットフィールドは任意のビット数を格納する
code: survey.c
typedef struct {
unsigned int first_visit: 1;
unsigned int come_again: 1;
unsigned int fingers_lost: 4;
unsigned int shark_attack: 1;
unsigned int days_a_week: 3;
}