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("書式", 値);

という形で使います。

このときの書式指定子は、

指定子対象
%dint
%s文字列
%fdouble

のように、
1つの値 を前提に設計されています。

問題点

  • Product 型は複数の値の集合
  • %P や %Product のような指定子は存在しない。
  • 表示方法は用途ごとに違う。

つまり、

「どう表示したいか」は人間が決める必要がある

ということです。

正しい構造体の表示方法

構造体を表示するときは、
メンバを1つずつ取り出して表示します。

printf("商品名:%s\n", apple.name);
printf("価格 :%d円\n", apple.price);
printf("在庫 :%d個\n", apple.stock);

少し手間はかかりますが、

  • 表示形式を自由に決められる。
  • 見やすい
  • 意図が明確

という大きなメリットがあります 😊

表示処理は「役割」と考える

実務では、

  • 表示用の関数を作る。
  • フォーマットを統一する。

といった工夫をします。

構造体は、

データをまとめるもの
表示や計算は人が指示するもの

という役割分担を意識すると、混乱しなくなります。

まとめ:構造体の正しい付き合い方

最後に、今日のポイントを整理しましょう。

  • 構造体は複数データの集合
  • 計算・比較・直接表示はできない。
  • 代入だけは特別に許可されている。
  • 表示はメンバを取り出して行う。

構造体は少し不自由に見えますが、
その分、安全でバグを生みにくい設計になっています。

この制約を理解した瞬間から、
構造体は「頼れる整理箱」に変わりますよ 😊

ここまで理解できれば、
構造体に関する 「なぜ?」の正体 はほぼ解消です 👍

次は、

  • 構造体配列
  • 構造体を関数に渡す。
  • ポインタと構造体

へ進むと、一気に実践レベルになりますよ 😊