【独学C言語】変数のスコープ

※この記事は「2021年4月30日」に更新しました。

変数のスコープについて。

前回は、関数について、解説しました。

【独学C言語】関数とは

【独学C言語】関数とは

2020年4月27日

今回は、変数が使える範囲や有効期間について、解説していきます。

変数のスコープとは

スコープとは、有効範囲のことです。

つまり、変数のスコープというのは、変数の有効範囲のことです。

スコープ外では、変数を使うことができません。

なぜ、こんな決まりがあるのかというと、どこでも参照できるようにすると困ることもあるからです。

基本的に必要のないところでの変数の参照はなるべく避けた方が良いです。

どこでも参照や変更ができてしまうと、予期しないエラーを引き起こす原因にもなります。



記憶クラス

C言語では、記憶クラスによって、変数が使える範囲(スコープ)や存在する期間、格納される場所が決まっています。

記憶クラスを正しく理解して、適切な指定をすることは、C言語を使いこなすための必須条件とも言えます。

auto変数(ローカル変数)

auto変数(ローカル変数)とは、関数内(ブロック内)で定義された変数のことです。

今までのサンプルプログラムで使ってきた変数は、ほとんど auto変数です。

関数内でのみ使用することができ、関数の実行が終了すると、メモリ上から削除されます。

初期値は不定なので、どんな値が入っているかわかりません。

以下のように変数を宣言することができます。

auto int 変数名;    /* int型、auto変数 */

しかし、通常 auto というのは、省略することがほとんどです。

つまり、以下のように宣言します。

int 変数名;    /* int型、auto変数 */

外部変数(グローバル変数)

外部変数(グローバル変数)とは、関数の外部で定義された変数のことです。

外部変数は、定義された時点でそのファイルのどこからでも使うことができます。

プログラムが終了するまでは、メモリから削除されることもありません。

使用するメリットは、どこからでも利用できるので便利だということです。

デメリットは、どこからでも変更される可能性があるので、予期しないエラーを引き起こす原因になりかねないということです。

static変数(静的変数)

static変数(静的変数)は、関数が呼び出されるたびに初期化されないようにしたいけど、外部変数は使いたくないというときに使えます。

一度だけ初期化され、その後はプログラムが終了するまで、値を保持してくれます。

外部変数ではないので、スコープも関数内(ブロック内)のみ有効です。

以下のように変数を宣言することができます。

static int 変数名;    /* int型、static変数 */

サンプルプログラム【C言語】

変数のスコープを理解するためのサンプルプログラムです。

sample1.c というソースファイルを作成します。

#include <stdio.h>

void display(int);

int main(void)
{
    display(10);

    return 0;
}

void display(int a)
{
    int b;

    printf("\n");

    printf("a = %d b = %d", a, b);

    printf("\n\n");
}

このサンプルプログラムは、auto変数(ローカル変数)を理解するためのものです。

実行結果は、以下の通りです。

変数のスコープ

a は、10 という値が引数として、display関数に渡されています。

display関数内で定義した b という変数は、初期化していないので、printf関数で表示してみるとよくわからない値が表示されています。

不定なのでどのような値が入っているかわからないのです。

次に sample2.c というソースファイルを作成します。

#include <stdio.h>

int a = 5;

void display(void);

int main(void)
{
    printf("\n");

    printf("a = %d", a);
    printf("\n");
    display();

    printf("\n\n");

    return 0;
}

void display(void)
{
    printf("a = %d", a);
}

このサンプルプログラムは、外部変数(グローバル変数)を理解するためのものです。

実行結果は以下の通りです。

変数のスコープ

main関数、display関数のどちらからでも変数 a を呼び出すこともできます。

次に sample3.c というソースファイルを作成します。

#include <stdio.h>

void display(void);

int main(void)
{
    printf("\n");

    display();
    printf("\n");
    display();
    printf("\n");
    display();

    printf("\n\n");


}

void display(void)
{
    static int cnt = 0;

    cnt++;

    printf("cnt = %d", cnt);
}

このサンプルプログラムは、static変数(静的変数)を理解するためのものです。

実行結果は、以下の通りです。

変数のスコープ

display関数を呼び出すたびに display関数内の static変数 cnt がインクリメントされていることがわかります。

独学C言語の記事について【おまけ】

タカフミブログの独学C言語シリーズは、C言語を独学するということを目的に記事を書いています。

他の記事に興味がある方は以下をご参照下さい。

C言語に関する記事一覧

C言語は、古典的なイメージがある方もいるかもしれませんが、他の多くのプログラミング言語のベースになっています。

実際に本格的なソフトを開発するとなるとなかなか大変ですが、とにかくハードウェアのリソースが少なくても高速に動くのが最大のメリットです。

プログラマーや SE(システムエンジニア)を目指す方は一度お試し下さい。

最後に【変数のスコープ】

いかがでしょうか。

今回は、変数のスコープについて、紹介しました。

次回は、ポインタについて、解説していきます。

【独学C言語】ポインタとは

【独学C言語】ポインタとは

2020年5月1日

変数のスコープは、他のプログラミング言語でも重要な考え方なので、しっかり理解して、適切な指定ができるように練習していきましょう。