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

    関数で値を書き換える

    関数の中で書き換えても戻らない

    前回、scanf は番地を受け取るから呼び出し元を書き換えられる、という話をしました。同じことを、自分で書く関数でもできます。

    まず、できない書き方から見ます。

    c

    void add_bonus(int score) {
        score = score + 5;   // 写しを書き換えているだけ
    }
    
    int main(void) {
        int score = 80;
        add_bonus(score);
        printf("%d\n", score);   // 80 のまま
    }

    add_bonus が受け取る score は、呼び出し元とは別の変数です。名前が同じでも中身は写しなので、関数から抜けた瞬間に捨てられます。

    番地を渡せば書き換えられる

    引数の型をポインタにして、呼び出すときに & を付けます。

    c

    void add_bonus(int *score) {
        *score = *score + 5;   // 指している先を書き換える
    }
    
    int main(void) {
        int score = 80;
        add_bonus(&score);
        printf("%d\n", score);   // 85 になる
    }

    関数の中では score はポインタなので、値を触るときは必ず * を付けます。score = score + 5; と書くとポインタの番地のほうを動かしてしまうので、コンパイラに叱られるか、書いた本人の意図と違う動きになります。

    この渡し方を 参照渡し と呼びます。正確に言えば C にあるのは値渡しだけで、番地という値を渡すことで参照渡しの効果を作っている、という理解が正しい形です。

    結果を 2 つ以上返したいとき

    return で返せる値は 1 つだけです。ところが実際には、合計と最高点を一度に知りたい、といった場面がよくあります。ポインタの引数を使えば、必要な数だけ結果を持ち帰れます。

    c

    void swap_score(int *a, int *b) {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }

    入れ替えは、片方を先に上書きすると元の値が消えるので、一時変数 tmp に逃がしてから交換します。この 3 行の型は、これから先どの言語でも出てくる基本形です。

    呼び出し側が & を付け忘れると、int を int * の引数に渡すことになるので、コンパイラが型の食い違いを教えてくれます。前回の scanf と違って気づきやすい部類のミスなので、素直に直してください。

    では、2 人の点数を入れ替える関数を書いてみましょう。

    要件

    1. 点数を2つ読み込む
    2. void swap_score(int *a, int *b) を定義して、指している先の値を入れ替える
    3. 入れ替える前を 「入替え前は80点と95点です」 の形で表示する
    4. 入れ替えたあとを 「入替え後は95点と80点です」 の形で表示する

    ヒント

    一時変数に int tmp = *a; と逃がしてから交換します

    呼び出しは swap_score(&score1, &score2); です

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

    関連レッスン

    • 配列を関数に渡す

      配列を引数に取る関数を書けるようになります。

    • つくる 入力処理の関数化

      入力処理をポインタ引数の関数として切り出せるようになります。

    • 第7章クイズ

      第7章の理解を確認します。

    • 構造体

      関連するデータを1つの型にまとめられるようになります。

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

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

    • 関数処理に名前を付けて再利用できる単位
    • 変数データに名前をつけて参照する仕組み
    • 引数位置引数=順番で渡す。
    main.c
    エディタを読み込んでいます

    メモ

    関数で値を書き換える

    ⌘S で保存