この記事では、C言語におけるグローバル変数とローカル変数の違いについて解説します。
さらに、同じ名前のグローバル変数とローカル変数を使った場合の動作についても詳しく説明します。
初心者の方でもわかりやすく、サンプルコードを交えて解説していきます。
グローバル変数とローカル変数の違い
グローバル変数とは
グローバル変数は、プログラムのどの場所からでもアクセスできる変数です。
グローバル変数は、関数の外部で宣言され、プログラム全体で共有されます。
例えば、以下のようにグローバル変数を宣言することができます。
int globalVariable = 10;
ローカル変数とは
ローカル変数は、関数内で宣言され、その関数内でのみアクセス可能な変数です。
ローカル変数は、関数が呼び出されるたびに新しいメモリ領域が割り当てられ、関数の実行が終了するとそのメモリ領域は解放されます。
以下のようにローカル変数を宣言することができます。
void myFunction() {
int localVariable = 20;
// ローカル変数の処理
}
グローバル変数とローカル変数の違い
グローバル変数とローカル変数の違いは、スコープと生存期間にあります。
グローバル変数はプログラム全体で共有されるため、どの場所からでもアクセスできますが、ローカル変数は関数内でのみアクセス可能です。
また、グローバル変数はプログラムが終了するまでメモリ上に存在し続けますが、ローカル変数は関数の実行が終了するとメモリが解放されます。
グローバル変数の使用は適切に行う必要があり、ローカル変数のスコープを意識してプログラムを設計することが求められます。
同じ名前のグローバル変数とローカル変数を使うとどうなるのか
プログラミングにおいて、同じ名前の変数をグローバル変数とローカル変数の両方で使用することは可能です。
しかし、その結果は予測できない場合があります。
このセクションでは、同じ名前のグローバル変数とローカル変数を使った場合の動作について詳しく見ていきましょう。
グローバル変数とローカル変数のスコープ
まず、グローバル変数とローカル変数のスコープについて説明します。
グローバル変数は、プログラムのどこからでもアクセスできる変数です。
一方、ローカル変数は、その変数が宣言されたブロック内でのみアクセスできる変数です。
つまり、ローカル変数はそのブロック内でのみ有効です。
同じ名前のグローバル変数とローカル変数の宣言
同じ名前のグローバル変数とローカル変数を使う場合、注意が必要です。
グローバル変数とローカル変数は、同じ名前で宣言されている場合、異なる変数として扱われます。
つまり、グローバル変数とローカル変数は別々のメモリ領域を持ち、別々の値を保持します。
以下の例を見てみましょう。
#include <stdio.h>
int globalVariable = 10; // グローバル変数
void myFunction() {
int localVariable = 20; // ローカル変数
printf("グローバル変数: %d\n", globalVariable);
printf("ローカル変数: %d\n", localVariable);
}
int main() {
myFunction();
return 0;
}
上記のコードでは、globalVariable
という名前のグローバル変数と、localVariable
という名前のローカル変数があります。
myFunction関数
内でそれぞれの変数を出力しています。
同じ名前のグローバル変数とローカル変数のアクセス
同じ名前のグローバル変数とローカル変数を使った場合、その変数へのアクセスはスコープによって異なります。
グローバル変数はどこからでもアクセスできるため、どの関数でもその値を読み書きすることができます。
一方、ローカル変数はそのブロック内でのみ有効なため、そのブロック内でのみアクセスできます。
以下の例を見てみましょう。
#include <stdio.h>
int globalVariable = 10; // グローバル変数
void myFunction() {
int localVariable = 20; // ローカル変数
printf("グローバル変数: %d\n", globalVariable);
printf("ローカル変数: %d\n", localVariable);
globalVariable = 30; // グローバル変数の値を変更
localVariable = 40; // ローカル変数の値を変更
}
int main() {
myFunction();
printf("グローバル変数: %d\n", globalVariable);
// printf("ローカル変数: %d\n", localVariable); // エラー: ローカル変数にアクセスできない
return 0;
}
上記のコードでは、myFunction関数
内でグローバル変数とローカル変数の値を変更しています。
その後、main関数
内でグローバル変数の値を出力しています。
しかし、ローカル変数にはアクセスできないため、コメントアウトされた行はエラーとなります。
同じ名前のグローバル変数とローカル変数の影響範囲
同じ名前のグローバル変数とローカル変数を使った場合、それぞれの変数は異なるスコープを持ちます。
グローバル変数はプログラム全体で有効なため、どの関数でもその値を読み書きすることができます。
一方、ローカル変数はそのブロック内でのみ有効なため、そのブロックを抜けるとその変数は無効になります。
以下の例を見てみましょう。
#include <stdio.h>
int globalVariable = 10; // グローバル変数
void myFunction() {
int localVariable = 20; // ローカル変数
printf("グローバル変数: %d\n", globalVariable);
printf("ローカル変数: %d\n", localVariable);
}
int main() {
myFunction();
printf("グローバル変数: %d\n", globalVariable);
// printf("ローカル変数: %d\n", localVariable); // エラー: ローカル変数にアクセスできない
return 0;
}
上記のコードでは、myFunction関数
内でグローバル変数とローカル変数の値を出力しています。
その後、main関数
内でもグローバル変数の値を出力しています。
しかし、ローカル変数はmyFunction関数
内でのみ有効なため、コメントアウトされた行はエラーとなります。
以上が、同じ名前のグローバル変数とローカル変数を使った場合の動作についての解説です。
グローバル変数とローカル変数は異なるスコープを持ち、別々のメモリ領域を使用します。
そのため、同じ名前の変数を使う際には注意が必要です。