C の基本:複雑な型
構造体
配列は同じ型のデータを並べたものですが、プログラマが好きに型を組み合わせて新しい型を作る事もできます。
構造体型(structure type)は
| struct 名前 | |
| { | |
| 1つ目の要素の型 1つ目の要素の名前; | |
| 2つ目の要素の型 2つ目の要素の名前; | |
| ... | |
| } |
と書かれ、これ自体が型の名前になります。つまり例えば
| struct | |
| { | |
| int id; | |
| double score; | |
| } record; |
と書くと、変数recordは
- int型の要素id
- double型の要素score
を持つ型になります。これはメモリ上だと
| メモリ | ||||
|---|---|---|---|---|
| : | ||||
| (int分の領域) | record.id | record | ||
| (隙間) | ||||
| (double分の領域) | record.score | |||
| : |
の様になります。それぞれの要素は変数の名前.要素の名前でアクセスできます。
配列の場合とは異なり、構造体のそれぞれの要素が隙間なく並んでいるとは限りません。これは構造体自身やその要素が「キリのいい」アドレスにあるべきというハードウェアの都合によるものです。(アラインメントと呼ばれます。参考:「データ型のアラインメントとは何か,なぜ必要なのか?」)
標準ライブラリにメモリ領域の内容を比較するmemcmpという関数があるのですが、構造体の内容をこれで安易に比較しようとすると、各要素の値は完全に同一でも隙間の内容が異なる為に「一致する」と判定されない、という事が起きるので注意が必要です。