コース一覧
    C言語基礎 関数・配列編
    変数のスコープ

    C言語基礎 関数・配列編

    C言語の関数と配列を学び、処理を分割してデータを扱うコースです。

    1
    関数
    01. 関数を定義する15分
    02. 引数と戻り値15分
    03. プロトタイプ宣言15分
    04. void関数15分
    05. 変数のスコープ15分
    06. つくる 関数に分割15分
    07. 第5章クイズ10分
    2
    配列と文字列
    01. 配列15分
    02. 配列とfor15分
    03. 集計15分
    04. 最高点と最低点15分
    05. 文字列(char配列)15分
    06. 文字列関数15分
    07. 文字列の入力15分
    08. つくる 配列で成績管理15分
    09. 第6章クイズ10分

    変数のスコープ

    関数の中の変数は外から見えない

    関数を分けはじめると、ほぼ全員が一度は次のコードを書きます。

    c

    void show_total(void) {
        printf("合計は%d点です\n", total);   /* total は main のもの */
    }
    
    int main(void) {
        int total = 255;
        show_total();
        return 0;
    }

    コンパイルすると use of undeclared identifier 'total' と怒られます。main の中に確かに total はあるのに、show_total からは見えません。

    変数が使える範囲のことを スコープ と呼びます。関数の中で宣言した変数は ローカル変数 で、そのスコープは宣言した波カッコの中だけです。main も1つの関数なので、main で宣言した変数も main 専用です。特別扱いはありません。

    直し方は、見せたい値を引数として渡すことです。

    c

    void show_total(int total) {
        printf("合計は%d点です\n", total);
    }
    
    int main(void) {
        int total = 255;
        show_total(total);
        return 0;
    }

    関数が必要とする値を引数リストに並べておくと、その関数だけを読めば「何を材料にしているか」が分かります。外の変数を勝手に読める仕組みだと、遠くの行を書き換えた影響がどこに出るか追えなくなります。見えないのは不便な制限ではなく、追跡できる範囲を狭く保つための仕組みです。

    同じ名前でも別の変数

    スコープが分かれているということは、違う関数で同じ名前を使っても衝突しないということです。

    c

    int add_bonus(int score) {
        int total = score + 5;
        return total;
    }
    
    int main(void) {
        int total = 0;
        total = total + add_bonus(70);
        printf("%d\n", total);   /* 75 */
        return 0;
    }

    add_bonus の total と main の total は、名前が同じだけの完全に別の変数です。add_bonus の中で total を 75 にしても、main の total は 0 のままで、変わるのは return された値を足したときだけです。

    これは第2章で学んだ、引数が値のコピーで渡されるという話とつながっています。関数どうしは値のやりとりだけでつながっていて、変数そのものを共有してはいません。

    生まれて消えるタイミング

    ローカル変数は、関数が呼ばれたときに作られ、関数が終わると消えます。add_bonus を3回呼べば、total は3回作られて3回消えます。前の呼び出しの値が残ることはないので、関数の頭で初期化を忘れても前回の続きから、ということは起きません。逆に言えば、値を次の呼び出しへ持ち越したいなら、戻り値で返して呼び出し元が持っておく必要があります。

    なお、for のカウンタのように波カッコの中で宣言した変数は、その波カッコを抜けた時点で見えなくなります。スコープの単位は関数ではなく波カッコだ、と覚えておくと正確です。

    では、同じ名前の変数を2つの関数に持たせて、混ざらないことを確かめましょう。

    要件

    1. add_bonus は点数を受け取り、5 を足した値を返す関数にする
    2. add_bonus の中では total という名前のローカル変数に計算結果を入れてから return する
    3. main でも total という名前の変数を用意し、0 で初期化して補正後の点数を足していく
    4. for 文で3人分の点数を scanf で読み込み、1人目 75点 の形で1行ずつ表示する
    5. 最後の行に 合計は255点です の形で main の total を表示する

    ヒント

    2つの total は名前が同じだけの別の変数です。片方を変えてももう片方は変わりません

    add_bonus の戻り値をいったん変数に受けておくと、表示と加算の両方に使えます

    番号は for のカウンタから作れます

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

    関連レッスン

    • つくる 関数に分割

      計算と判定と表示をそれぞれ別の関数に分けられるようになります。

    • 第5章クイズ

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

    • 配列

      同じ型の値をまとめて持てるようになります。

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

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

    • 関数処理に名前を付けて再利用できる単位
    • 変数データに名前をつけて参照する仕組み
    • コンパイルソースをバイトコードへ変換する処理
    • スコープ変数が参照可能な範囲
    • 引数位置引数=順番で渡す。
    • リスト順序付きで複数の値を扱うデータ構造
    • 戻り値呼び出し元への返答を表す点線矢印
    • カウンタ数を保持して増減する典型 UI
    main.c
    エディタを読み込んでいます

    メモ

    変数のスコープ

    ⌘S で保存