
C言語入門|構造体を扱う際の制約と正しい使い方
構造体を使い始めると、
「おおっ、これでデータがスッキリ整理できるぞ!」
とテンションが上がりますよね 😊
でもその一方で、
- 計算しようとしてエラーになる。
- 比較しようとしてうまくいかない。
- printf でまとめて表示したくなる。
といった 「あれ? なんでできないの?」 にも必ず遭遇します。
ここでは、
構造体ができること・できないこと を正しく理解し、
安全に使いこなすための考え方を、順番にやさしく解説していきます。

構造体を使うときに必ず知っておくべき制約
まず、いちばん大事な前提からです。
構造体は、
複数の値をひとまとめにした「データのかたまり」
です。
そのため、基本型(int や char)と同じ感覚では扱えません。
特に注意が必要なのが、次のポイントです。
構造体の重要な注意点
- 構造体そのものに対して、計算・比較はできない。
- printf などで、そのまま表示することはできない。
- ただし、構造体同士の代入(コピー)だけは可能
このルールを、表で整理してみましょう。
基本型と構造体型でできる操作の違い
| 操作内容 | 表示 printf | 計算 + | 比較 == | 代入(コピー) |
|---|---|---|---|---|
| 基本型 | ○ | ○ | ○ | ○ |
| 構造体型 | × | × | × | ○ |
※ 構造体のメンバが int や char の場合
※ 文字列配列(String 型)は別途注意が必要
「えっ、代入だけできるの?」
と思うかもしれませんが、これにはちゃんとした理由があります。
なぜ構造体は計算や比較ができないの?
int 型の変数なら、
a + b
a == bのように、
1つの値同士 を対象に計算や比較ができます。
しかし構造体はどうでしょう?
typedef struct {
char name[20];
int price;
int stock;
} Product;この Product 型には、
- 文字列
- 数値
- 数値
と、性質の異なるデータが混ざっています。
ここで問題になること
- どのメンバを足すのか?
- 何を基準に等しいと判断するのか?
これをコンピュータが自動で判断するのは不可能です。
だからC言語では、
構造体に対する計算・比較は禁止
という、とても厳格で安全なルールが採用されています。
例外:構造体の代入(コピー)
唯一の例外が、構造体の代入です。
Product a = {"りんご", 120, 10};
Product b;
b = a; // OKこれは、
- name
- price
- stock
といった すべてのメンバを丸ごとコピー する処理になります。
なぜ代入だけ許されているの?
理由はシンプルで、
- コピーの意味が明確
- 判断の余地がない。
- 安全に実装できる。
からです。
「構造体は箱ごとコピーできる」
と覚えておくと分かりやすいですね 😊
構造体はそのまま表示できない
次によくある落とし穴が、表示です。
やってしまいがちなコード
Product apple = {"りんご", 120, 10};
printf("%s", apple);「商品名・価格・在庫をまとめて表示したい」
という気持ちは、とてもよく分かります。
ですが、これは正しく動作しません ❌
printf が構造体を表示できない理由
printf 命令は、
printf("書式", 値);という形で使います。
このときの書式指定子は、
| 指定子 | 対象 |
|---|---|
| %d | int |
| %s | 文字列 |
| %f | double |
のように、
1つの値 を前提に設計されています。
問題点
- Product 型は複数の値の集合
- %P や %Product のような指定子は存在しない。
- 表示方法は用途ごとに違う。
つまり、
「どう表示したいか」は人間が決める必要がある
ということです。
正しい構造体の表示方法
構造体を表示するときは、
メンバを1つずつ取り出して表示します。
printf("商品名:%s\n", apple.name);
printf("価格 :%d円\n", apple.price);
printf("在庫 :%d個\n", apple.stock);少し手間はかかりますが、
- 表示形式を自由に決められる。
- 見やすい
- 意図が明確
という大きなメリットがあります 😊
表示処理は「役割」と考える
実務では、
- 表示用の関数を作る。
- フォーマットを統一する。
といった工夫をします。
構造体は、
データをまとめるもの
表示や計算は人が指示するもの
という役割分担を意識すると、混乱しなくなります。
まとめ:構造体の正しい付き合い方
最後に、今日のポイントを整理しましょう。
- 構造体は複数データの集合
- 計算・比較・直接表示はできない。
- 代入だけは特別に許可されている。
- 表示はメンバを取り出して行う。
構造体は少し不自由に見えますが、
その分、安全でバグを生みにくい設計になっています。
この制約を理解した瞬間から、
構造体は「頼れる整理箱」に変わりますよ 😊
ここまで理解できれば、
構造体に関する 「なぜ?」の正体 はほぼ解消です 👍
次は、
- 構造体配列
- 構造体を関数に渡す。
- ポインタと構造体
へ進むと、一気に実践レベルになりますよ 😊
