コース一覧
    C言語基礎 ポインタ・構造体・ファイル
    構造体配列

    C言語基礎 ポインタ・構造体・ファイル

    C言語のポインタ、構造体、ファイル操作を学び、データを扱う基礎を固めるコースです。

    1
    ポインタの入口
    01. アドレスとは15分
    02. ポインタの&と*15分
    03. scanfの&の正体15分
    04. 関数で値を書き換える15分
    05. 配列を関数に渡す15分
    06. つくる 入力処理の関数化15分
    07. 第7章クイズ10分
    2
    構造体とファイル
    01. 構造体15分
    02. メンバの読み書き15分
    03. 構造体配列15分
    04. 構造体と関数15分
    05. ファイルに書き込む15分
    06. ファイルを読み込む15分
    07. ファイルの失敗に備える15分
    08. つくる 保存機能15分
    09. 第8章クイズ10分
    3
    総合制作
    01. メニュー統合15分
    02. 自由拡張15分
    03. 完成と次のステップ10分

    構造体配列

    2本の配列を1本にたたむ

    第6章で作った成績管理CLI は、こういう形でした。

    c

    char names[3][32];
    int scores[3];

    名前の表と点数の表が別々に並んでいて、同じ番号どうしが対応する約束でした。構造体を覚えた今なら、これを 1 本にできます。

    c

    struct Student list[3];

    list は「struct Student が 3 個並んだ配列」です。list[0] が 1 人目まるごと、list[1] が 2 人目まるごとを指します。名前と点数が同じ箱に入っているので、対応がずれる余地がそもそもありません。

    添字とドットを続けて書く

    メンバに触るときは、添字で人を選んでからドットでメンバを選びます。

    c

    list[1].score = 90;
    printf("%s\n", list[1].name);

    list[1].score は「list の 2 人目の中の score」です。[] と . は左から順に働くので、この順番で書けば意図どおりに読まれます。list.score[1] のように逆さに書くとエラーになりますが、これは配列とメンバの役割を取り違えたときに出やすい間違いです。

    入力も同じ調子で書けます。& の付け方は前回と変わりません。

    c

    scanf("%31s", list[i].name);
    scanf("%d", &list[i].score);

    list[i].name は配列なので & なし、list[i].score は int の値なので & あり、という区別です。

    ループとの相性がよくなる

    1 本にたたんだいちばんの効果は、ループが読みやすくなることです。

    c

    for (i = 0; i < 3; i++) {
        printf("%s %d点\n", list[i].name, list[i].score);
    }

    2 本の配列を持っていたときは、ループの中で names[i] と scores[i] の 2 つを常に見比べる必要がありました。今は list[i] という 1 人分を取り出すだけで済みます。

    この形は、あとで「点数の高い順に並べ替える」ような処理を書くときにも効いてきます。list[0] と list[1] を入れ替えれば、名前も点数もセットで動くからです。前回学んだとおり構造体は代入でまるごとコピーできるので、入れ替えも tmp = list[0]; list[0] = list[1]; list[1] = tmp; の 3 行で済みます。名前の配列と点数の配列が別だったころは、名前のほうを strcpy で、点数のほうを代入で、と 2 通りのやり方を混ぜる必要がありました。

    人数の上限は自分で決める

    struct Student list[3] と書いた時点で、入る人数は 3 人までに固定されます。配列の枠を超えて list[3] に書き込んでも、コンパイラは何も言わないまま関係ないメモリを壊します。何人まで扱うかを先に決め、ループの条件をその数と必ず揃えておくことが、そのまま安全対策になります。

    では、3 人分を読み込んで一覧と平均を出しましょう。

    要件

    1. struct Student list[3] を使う
    2. for ループで3人分の名前と点数を読み込む
    3. 一覧は「田中 82点」の形で1人1行ずつ表示する
    4. 最後に「平均は81点です」の形で平均を表示する

    ヒント

    list[i].name は & なし、&list[i].score は & ありで scanf に渡します

    合計は読み込みのループの中で足していくと1回のループで済みます

    整数どうしの割り算なので小数は切り捨てられます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 構造体と関数

      構造体を引数に取る関数を書けるようになります。

    • ファイルに書き込む

      計算した成績をファイルに保存できるようになります。

    • ファイルを読み込む

      保存したデータを読み戻せるようになります。

    • ファイルの失敗に備える

      ファイルが無い初回起動でも落ちないプログラムを書けるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 配列サイズ固定の同型データの集まり
    • ループ繰り返し処理。矢印で戻すか専用記号で示す
    • 処理計算や代入を表す長方形
    • セット重複を持たない順序なし集合
    • メモリプログラムとデータを一時保持する高速領域
    main.c
    エディタを読み込んでいます

    メモ

    構造体配列

    ⌘S で保存