変数の有効範囲

「変数の有効範囲」等と大層なタイトルをつけましたが、
ここで、説明するのは単純なことです。
とりあえず下のソースを見てください。

void f();

int main()
{
  int x=1;
  f();
  return 0;
}

void f()
{
  x=3;
}

上のソースはコンパイルしようとしてもコンパイルエラーが発生します。
その原因は「変数xが見つからない(宣言されていない)」というものです。

変数xは確かにmain関数の中で宣言されています。
しかし、C言語ではある関数から別の関数で宣言された変数を操作できません。
というより、関数の中で宣言された変数はその関数の中からしか見えません。

さらに詳しく見ると変数は宣言されたブロックの中のみで見えます。
ブロックとは中括弧 {} のことですが、今はあまり関係ありません。

ここのタイトルに合わすと
「変数の有効範囲は変数が宣言されたブロックの始めから終わりまでである。」
といった感じのことになるでしょう。

また、関数が変われば同じ名前の変数などを作っても問題ありません。
実際にその例を示します。

void f();

int main()
{
  int x=1;
  f();
  return 0;
}

void f()
{
  int x;
  x=3;
}

今度はコンパイルエラーは発生しません。
しかし、main関数の変数xとf関数の変数xはまったくの別物です。
「北海道の鈴木さんと沖縄の鈴木さんは別人である」というのと似たようなものです。

このように変数は関数という柵の中から出られないようになっています。
現状で変数をこの柵から出す唯一の手段が引数だということに気付いてもらえたでしょうか?
これが、引数が必要とされる理由でもありますね。