Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】変数のスコープとは?記憶クラスとローカル・グローバル変数を徹底解説


記憶クラス(ストレージクラス)とは

C言語における記憶クラスは、変数の「スコープ(有効範囲)」「寿命(生存期間)」「リンケージ(結合)」を決める重要な要素です。

変数を完全に定義するためには、単に「型」を指定するだけでなく、記憶クラスについても理解しておく必要があります。

変数名は、コンピュータのメモリ上の物理的な位置を識別するものであり、その場所には変数の値を格納するためのビット列が割り当てられています。

記憶クラスを指定することで、次の4つの要素が決まります。

  • 変数がどこに格納されるか(メモリ上か、CPUのレジスタか)
  • 明示的に初期化しなかった場合の初期値
  • 変数のスコープ(プログラムのどの範囲からアクセスできるか)
  • 変数の寿命(いつ生成され、いつ破棄されるか)

主な記憶クラス指定子の一覧

指定子格納場所初期値スコープ寿命
autoメモリ(スタック領域)不定(ゴミ値)ブロック内ブロックの実行中のみ
staticメモリ(静的領域)0ブロック内/ファイル内プログラム終了まで
externメモリ(静的領域)0全ファイル(グローバル)プログラム終了まで
registerCPUレジスタ不定(ゴミ値)ブロック内ブロックの実行中のみ

スコープとは

スコープとは、変数などのオブジェクトの「可視性」を定義する概念であり、プログラムのどの場所からその変数にアクセスできるかを決定します。

変数のスコープは、大きく分けて「ローカル(局所的)」と「グローバル(大域的)」の2種類があります。

  • ローカル変数:関数やブロック({ } の中)で定義された変数はローカルスコープを持ちます。これらは、定義されたブロックの中でのみ参照できます。
  • グローバル変数:すべての関数の外側(グローバル領域)で定義された変数は、定義された位置からプログラムの終了まで有効となり、プログラム全体のどこからでもアクセスできます。

サンプルプログラム1:ローカル変数とグローバル変数の基本

以下は、変数のスコープを確認するC言語のプログラム例です。

#include <stdio.h>

int c = 30; /* グローバル領域 */

void fun(void) {
    printf("c=%d\n", c); /* グローバル変数を参照 */
}

int main(void) {
    int a = 10; /* ローカルスコープ */
    printf("a=%d, c=%d\n", a, c);
    fun();
    return 0;
}

実行結果

a=10, c=30
c=30

このように、main関数内のローカル変数aとグローバル変数cの両方が表示され、別の関数fun()からもグローバル変数cへアクセスできていることがわかります。一方、ローカル変数aはmain関数の外からは参照できません。

サンプルプログラム2:ローカル変数とグローバル変数の操作

#include <stdio.h>

int a = 1, b = 2; /* グローバル変数 */

int main(void) {
    int c, d; /* ローカル変数 */
    printf("cとdの値を入力してください:");
    scanf("%d%d", &c, &d);
    c = c + d;   /* ローカル変数の演算 */
    b = a * b;   /* グローバル変数の演算 */
    printf("cの値は:%d\n", c);
    printf("bの値は:%d\n", b);
    return 0;
}

実行結果

cとdの値を入力してください:4 7
cの値は:11
bの値は:2

ローカル変数cはユーザーが入力した値の合計(4+7=11)を保持し、グローバル変数bは初期値同士の掛け算(1×2=2)の結果を保持しています。それぞれのスコープに応じて変数が正しく扱われていることが確認できます。

まとめ

  • 記憶クラスは、変数の格納場所・初期値・スコープ・寿命を決定する。
  • スコープには「ローカル」と「グローバル」の2種類がある。
  • ローカル変数は、定義されたブロック内でのみ有効。
  • グローバル変数は、定義以降プログラム全体からアクセス可能。

  1. C言語のネストされたif-else文をわかりやすく解説!構文と実例付き

    ネストされたif-else文とは?「ネストされたif(入れ子のif)」とは、if文またはelse文の中に、さらに別のif文が含まれている構造のことを指します。つまり、ある条件分岐の処理ブロック内に、別の条件判断を組み込むことで、より複雑な条件判定を実現できるのです。この仕組みを使うことで、「複数の条件が同時に成り立つかどうか」「段階的な条件チェック」などを、柔軟にプログラムへ組み込むことが可能になります。基本構文ネストされたif-else文の基本的な書き方は以下の通りです。if (condition1){ if (condition2) stmt1; else

  2. C言語の単純if文(simple if)をわかりやすく解説

    はじめにC言語における「if」キーワードは、論理条件が真(true)と評価された場合にのみ、特定の一連のステートメントを実行するために使用される、最も基本的な条件分岐です。本記事では、単純if文(simple if)の構文、動作の仕組み、そして具体的なサンプルコードを通じてその基本を解説します。構文単純if文の構文は以下の通りです。if (condition) { Statement(s); }単純if文の動作ifブロック内のステートメントは、条件が真(true)の場合にのみ実行され、偽(false)の場合は一切実行されません。条件が真のときに実行したいステートメントが1つだけである場