コース一覧
    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分

    メンバの読み書き

    ドットは「この中の」という意味

    前回作った struct Student は、中に name と score という 2 つのメンバを抱えています。そのどちらを触るのかを指定する記号が ドット です。

    c

    struct Student s = {"田中", 82};
    
    printf("%d\n", s.score);   // 82 が出る
    s.score = 90;              // 書き換えもできる

    s.score は「s の中の score」と読みます。取り出すときも書き換えるときも同じ書き方で、ふつうの int 変数とまったく同じように扱えます。s.score + 5 のような計算も、if (s.score >= 80) のような判定もそのままできます。

    入力を直接メンバに入れる

    scanf の受け取り先にもメンバをそのまま書けます。ここで第7章の知識が効いてきます。

    c

    scanf("%31s", s.name);    // & は付けない
    scanf("%d", &s.score);    // & を付ける

    違いの理由は前章のとおりです。s.name は char の 配列 なので、書いただけで先頭のアドレスを表します。もう住所なので & は要りません。一方 s.score はただの int の値なので、書き込んでもらうには & を付けて住所を渡す必要があります。

    %31s の 31 は、name が 32 個分しかないので 31 文字までで打ち切る、という安全装置でした。構造体の中に入っても配列の性質は変わらないので、この用心もそのまま必要です。

    構造体は代入でまるごとコピーできる

    配列は a = b という代入ができませんでした。ところが構造体は、メンバに配列を含んでいても、まるごと代入できます。

    c

    struct Student backup = s;   // 名前も点数もコピーされる

    これは中身が丸ごと複製された 別の変数 です。あとから backup.score を変えても s.score は動きません。名前と点数をひとかたまりで扱えることの、いちばん分かりやすい利点です。

    この性質は、次々回に構造体を関数へ渡すときの動きにも直結します。関数の引数も代入と同じくコピーが渡るからです。

    メンバ名は他と重ならない

    もうひとつ気楽な点があります。メンバの名前は構造体の中だけで通用するので、外にある変数と同じ名前でも衝突しません。int score; という変数が別にあっても、s.score は必ず構造体の中の点数を指します。逆に言うと、s. を書き忘れて score とだけ書いたときは、外側の別の変数を触ってしまい、コンパイルが通ったまま値が更新されない、という間違いが起こります。点数が変わらないときは、まずドットの書き忘れを疑ってください。

    では、入力した学生の点数に加点する練習をしましょう。

    要件

    1. struct Student を name(char 32個の配列) と score(int) で定義する
    2. scanf で名前と点数を読み、メンバに直接入れる
    3. 1行目は「田中さんの点数は82点です」の形で表示する
    4. 2行目は加点後の点数を「加点後は87点です」の形で表示する

    ヒント

    s.name は配列なので scanf に & は付けません。s.score には & が要ります

    名前は %31s で読むと 32 個の枠からはみ出しません

    加点は s.score = s.score + 5; と書けます

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

    関連レッスン

    • 構造体配列

      学生一覧を1本の配列で持てるようになります。

    • 構造体と関数

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

    • ファイルに書き込む

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

    • ファイルを読み込む

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

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

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

    • 変数データに名前をつけて参照する仕組み
    • 配列サイズ固定の同型データの集まり
    • 関数処理に名前を付けて再利用できる単位
    • 引数位置引数=順番で渡す。
    • コンパイルソースをバイトコードへ変換する処理
    main.c
    エディタを読み込んでいます

    メモ

    メンバの読み書き

    ⌘S で保存