【C言語入門】グローバル変数の使い方

グローバル変数って使ってますか?ひとつの変数に対して処理する項目が多くなってくると、処理項目ごとに関数を分けて定義します。

そうするとどの関数からも使用できる変数が必要になってきます。このように複数の関数から使用できる変数がグローバル変数です。

この記事では、グローバル変数について

  • グローバル変数とは
  • グローバル変数の使い方
  • という基本的な内容から、

  • externの使い方
  • など応用的な内容についても解説していきます。

    今回はグローバル変数について、使い方をわかりやすく解説します!

    目次

    グローバル変数とは

    グローバル変数とは、複数の関数から使用できる変数のことを言います。これに対して、ひとつの関数内でのみ使用できる変数のことをローカル変数といいます。

    グローバル変数はどの関数のブロック内にも含まれていません。ローカル変数はある関数のブロック内で定義されます。また、グローバル変数は複数のファイルで共有して使用する場合もあります。

    この場合は、グローバル変数の定義の前に「extern」句を使用して記述します。

    グローバル変数の使い方

    まずはひとつのファイル内でグローバル変数を使う場合についてみていきましょう。グローバル変数は関数のブロック外に記述します。

    サンプルコードで確認していきましょう。

    #include 
    #include 
    
    float answer; // グローバル変数(数値)
    char country[30]; // グローバル変数(配列)
    
    void mydiv(int i1, int i2) {
        float f1 = (float)i1, f2 = (float)i2; // ローカル変数に代入
        answer = f1 / f2; // グローバル変数に代入
    }
    
    void mymul(float f1, float f2) {
        answer = f1 * f2; // グローバル変数に代入
    }
    
    void greeting() {
        printf("Hello %s!\n", country);
    }
    
    int main(void) {
        mydiv(1, 2);
        printf("answer: %f\n", answer);
        
        mymul(answer, 3.0f);
        printf("answer: %f\n", answer);
        
        strcpy(country, "Japan"); // グローバル変数に代入
        
        greeting();
        
        return 0;
    }
    

    実行結果:

    answer: 0.500000
    answer: 1.500000
    Hello Japan!
    

    このサンプルコードではfloat型のグローバル変数「answer」とchar型配列(文字列)のグローバル変数「country」が定義され、どの関数のブロック内にも含まれていません。

    グローバル変数「answer」はmydiv、mymul、main関数内で使用され、グローバル変数「country」はgreeting、main関数内で使用されています。

    グローバル変数「answer」はmain関数内のmydiv関数が実行される際にmydiv関数内で初期化され、使用される度に値が更新されています。グローバル変数「country」はmain関数内で代入初期化されています。

    これに対してローカル変数「f1」、「f2」はmydiv関数でのみ使用されています。

    externの使い方

    複数のファイルで変数を共有する必要がある場合があります。そんな場合はグローバル変数の型と変数名の定義の前に「extern」句を付けます。

    グローバル変数を定義したファイルとは別のファイルから使用することになるので、ヘッダーファイルに型と変数名を定義します。

    このヘッダーファイルをインクルードしたソースファイルで初期化を行います。それではサンプルコードで確認していきましょう。

    なお、このサンプルコードではグローバル変数「answer」と「country」の定義をヘッダーファイル「test.h」で行います。このヘッダーファイルのソースコードは「test.c」ファイルで、実行処理を行うソースコードは「main.c」ファイルです。

    test.h:

    extern float answer; // グローバル変数(数値)
    extern char *country; // グローバル変数(配列)
    

    test.c:

    #include "test.h"
     
    float answer = 0.0f; // グローバル変数(数値)
    char *country = ""; // グローバル変数(配列)
    

    main.c:

    #include 
    #include "test.h"
    
    void mydiv(int i1, int i2) {
        float f1 = (float)i1, f2 = (float)i2; // ローカル変数に代入
        answer = f1 / f2; // グローバル変数に代入
    }
    
    void greeting() {
        printf("Hello %s!\n", country);
    }
    
    int main(void) {
        printf("answer: %f\n", answer); // 初期化結果を表示
        greeting(); // 初期化結果を表示
        
        mydiv(1, 2);
        printf("answer: %f\n", answer);
        
        country = "Japan"; // グローバル変数に代入
        greeting();
        
        return 0;
    }
    
    

    実行結果:

    answer: 0.000000
    Hello !
    answer: 0.500000
    Hello Japan!
    

    このサンプルコードではヘッダーファイル「test.h」でグローバル変数を定義し、ソースファイル「test.c」で初期化しています。

    ヘッダーファイル「test.h」でグローバル変数を定義する際には、型と変数名の宣言の前に「extern」句を使用しています。

    実行ファイル「main.c」ではヘッダーファイル「test.h」をインクルードし、別のファイルで定義したグローバル変数「answer」と「country」を使用して処理を実行しています。

    まとめ

    ここでは、グローバル変数の使い方について説明しました。

    グローバル変数は複数の関数もしくは複数のファイルで変数を共有する必要がある場合に使用します。

    使いこなすことができるように、この記事を何度も参考にして下さいね!

    この記事を書いた人

    熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
    お問合せはこちらでも受け付けています。
    info@sss-lab.com

    目次