C言語入門|ローカル変数とスコープの基本

関数、引数、戻り値と学んできて、
そろそろこんな疑問が湧いてきた頃ではないでしょうか。

「毎回、引数とか戻り値で値を渡すのって、
ちょっと面倒じゃないですか?」

「main 関数で作った変数を、そのまま別の関数でも
使えたら楽なのに…」

気持ちはとてもよくわかります。
でも、C言語では それができない理由 があります。

この記事では、その理由となる
ローカル変数とスコープ(有効範囲) の基本を
じっくり確認していきましょう。

変数はどこからでも見えるわけではない

まずは、ありがちな発想をコードにしてみます。

引数や戻り値はいらないのでは?(エラー例)

#include <stdio.h>

void calcSum(void)
{
    int total = a + b;   // mainで作った変数を使える?
    printf("%d + %d = %d\n", a, b, total);
}

int main(void)
{
    int a = 80;
    int b = 20;
    calcSum();

    return 0;
}

ぱっと見た感じでは、

「a と b は main 関数でちゃんと用意しているし、
問題なさそう」

と思ってしまいますよね。

しかし、このプログラムは
変数 a と b が見つからない という
コンパイルエラーになります。

原因はスコープ(有効範囲)

このエラーの原因は、
変数のスコープ にあります。

スコープとは、
その変数が使える範囲 のことです。

C言語では、次のルールが基本です。

ルール内容
宣言された場所変数が使える範囲を決める。
ブロック{ } の中だけが有効範囲
外側から内側の変数は見えない。

つまり、

  • main 関数で宣言した変数 a と b
  • そのスコープは main 関数の中だけ

ということになります。

calcSum 関数の中からは、
main 関数の中にある変数は 見えない のです。

関数ごとに見える世界が違う

プログラム全体を見ている私たち人間は、

「ここに a があって、ここに b がある」

と把握できます。

でも、C言語のルールでは、
関数ごとに見える世界が区切られている のです。

関数見える変数
mainmain 内で宣言した変数
calcSumcalcSum 内で宣言した変数

この「区切られた世界」があるからこそ、
関数は安全に独立して動けます。

ローカル変数とは何か

関数の中で宣言された変数を
ローカル変数 と呼びます。

ローカル変数には、次の特徴があります。

特徴内容
有効範囲宣言された関数の中だけ
寿命関数の実行が終わると消える
独立性他の関数とは完全に別物

また、関数の1行目に書く仮引数も、
実は ローカル変数の一種 です。

同じ名前でも別の変数

次のようなコードを考えてみましょう。

プロジェクト名:8-12-1 ソースファイル名: sample8-12-1.c

#include <stdio.h>

void showValue(void)
{
    int x = 10;
    printf("showValueのxは%dです\n", x);
}

int main(void)
{
    int x = 100;
    showValue();
    printf("mainのxは%dです\n", x);

    return 0;
}

このプログラムの出力は、次のようになります。

showValueのxは10です
mainのxは100です

同じ名前の変数 x ですが、

変数所属
x = 10showValue のローカル変数
x = 100main のローカル変数

まったくの別物として扱われています。

ローカル変数の寿命と独立性

ここで、ローカル変数の性質を
もう一度まとめておきましょう。

ポイント説明
寿命関数の実行が終わると消える。
可視性属する関数の外からは見えない。
独立性同名でも他の関数とは無関係

この性質があるからこそ、

  • 変数の衝突を防げる。
  • 関数を安心して再利用できる。

というメリットが生まれます。

なぜ引数と戻り値が必要なのか

ここまでの話で、
「じゃあ、関数同士はどうやって情報をやり取りするの?」
という疑問が出てきます。

答えはシンプルです。

引数と戻り値を使うしかありません。

  • 渡したい情報は引数で渡す。
  • 結果は戻り値で受け取る。

このルールがあるから、
関数は独立した部品として安全に動作できるのです。

まとめ:スコープは関数の安全装置

ローカル変数とスコープは、
最初は少し面倒に感じるかもしれません。

でも実は、

  • バグを防ぎ
  • 読みやすいコードを作り
  • 大きなプログラムを安全に組み立てる

ための 大切な安全装置 です。

この考え方をしっかり身につけておくと、
引数や戻り値の意味も、
ぐっと自然に理解できるようになりますよ。