
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言語のルールでは、
関数ごとに見える世界が区切られている のです。
| 関数 | 見える変数 |
|---|---|
| main | main 内で宣言した変数 |
| calcSum | calcSum 内で宣言した変数 |
この「区切られた世界」があるからこそ、
関数は安全に独立して動けます。
ローカル変数とは何か
関数の中で宣言された変数を
ローカル変数 と呼びます。
ローカル変数には、次の特徴があります。
| 特徴 | 内容 |
|---|---|
| 有効範囲 | 宣言された関数の中だけ |
| 寿命 | 関数の実行が終わると消える |
| 独立性 | 他の関数とは完全に別物 |
また、関数の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 = 10 | showValue のローカル変数 |
| x = 100 | main のローカル変数 |
まったくの別物として扱われています。
ローカル変数の寿命と独立性
ここで、ローカル変数の性質を
もう一度まとめておきましょう。
| ポイント | 説明 |
|---|---|
| 寿命 | 関数の実行が終わると消える。 |
| 可視性 | 属する関数の外からは見えない。 |
| 独立性 | 同名でも他の関数とは無関係 |
この性質があるからこそ、
- 変数の衝突を防げる。
- 関数を安心して再利用できる。
というメリットが生まれます。
なぜ引数と戻り値が必要なのか
ここまでの話で、
「じゃあ、関数同士はどうやって情報をやり取りするの?」
という疑問が出てきます。
答えはシンプルです。
引数と戻り値を使うしかありません。
- 渡したい情報は引数で渡す。
- 結果は戻り値で受け取る。
このルールがあるから、
関数は独立した部品として安全に動作できるのです。
まとめ:スコープは関数の安全装置
ローカル変数とスコープは、
最初は少し面倒に感じるかもしれません。
でも実は、
- バグを防ぎ
- 読みやすいコードを作り
- 大きなプログラムを安全に組み立てる
ための 大切な安全装置 です。
この考え方をしっかり身につけておくと、
引数や戻り値の意味も、
ぐっと自然に理解できるようになりますよ。
