C言語 入門 グローバル変数とマクロの違い(define、関数)

C Language

プログラムを簡単に速く書く方法ってある?

マクロって何?

マクロとグローバル変数の違いを知りたい!

この記事を読めば、これらの悩みを解決できます。マクロを使うとバグ対策にもなり、便利なので使いこなせるようにしましょう。

グローバル変数とマクロの説明の前に

まず、説明には関数を使うので、関数が分からないという人はこちらを参考にしてください。

今回は配列に入っている「0」から「5」までの5つの数字を、それぞれ3倍するプログラムを作っていきます。

このプログラムには「for文」が必要になるのですが、そのときに「グローバル変数」と「マクロ」が使えるととても便利になります。

まずは、あえてその2つを使わずにプログラムしていきます。

プロトタイプ宣言

最初はプロトタイプ宣言をします。

void sanbai(int b[],int i);

3倍するのに「sanbai」という自作関数を使うを使うためプロトタイプ宣言が必要になります。今回は配列を使うのでデータ型に「void」を使っています。

main関数

次に「main関数」が来ますが、ここで「for文」が必要になります。

int main()
{
   int b[5];
   int i;

   for (i = 0; i < 5; ++i)
   {
      b[i] = i;
      sanbai(b,i);
      printf("%d¥n", b[i]);
   }
}

これを見て全く分かんないという人もいるかもしれませんね。順を追って説明していきます。

まず、b[0],b[1],b[2],b[3],b[4],b[5]の5つと「i」という変数が変数宣言されています。

その「i」を使って「for文」を回しています。

最初は「i=0」なのでb[0]には「0」が代入され、自作関数「sanbai」でb[0]を3倍して、「printf」でb[0]が出力されます。

これを「i<5」の間つまり、b[4]まで続けてプログラムが終了します。

(じゃあ変数宣言で作ったb[5]はどうなるかと言うと、なにも値を入れることができません。

つくった配列を出力するとき、最後の変数には何も入れられないことは覚えてください。)

自作関数

自作関数は前回とほとんど同じです。

void sanbai(int b[],int i)
{
    b[i] *= 3;
}

b[i]を3倍するだけです。

出力するとこのようになります。

「for文」の中で毎回改行しているので、このように縦に表示されます。

では、このプログラムと同じものをグローバル変数とマクロを使って書いていきます。その前に、「グローバル変数」と「マクロの説明」をします。

グローバル変数とマクロとは?!

グローバル変数とマクロは似ていますが、別物であることを理解してください。

グローバル変数

実は、変数には2つの種類があります

1つ目は、「ローカル変数」というもので、今まで皆さんが勉強してきたものです。これは変数宣言をした場所(main関数、自作関数など)だけで使うことができます。

2つ目が、今から習う「グローバル変数」というものです。

グローバル変数は「main関数」、「自作関数」どちらでも使える変数です。その変数は、「main関数」、「自作関数」どちらで使っても、同じ「値」や「文字」が代入されています

これを使うと、先ほどのように「i」という変数を引数にする必要がなくなります。

使い方は、後ほどプログラムで詳しく解説します。

マクロ

マクロも「文字」で「数字」を置き換えますが、変数とは異なります。

変数は後から代入されている値を変えることができますが、マクロは代入する値を一度決めたら変えることはできません。(ようするに、マクロ=定数です。)そのため、後から変更する予定のない値に使います。「マクロを使うことをコンピュータに伝える」ことをマクロ定義と言います。

今回の場合だと「5」という数字は変更しないので、5をマクロ定義します。

実際にプログラムを見てみましょう。

#include<stdio.h>
#define N 5
int i;
void sanbai(int b[]);
int main()
{
   int b[N];

   for (i = 0; i < N; ++i)
   {
      b[i] = i;

      sanbai(b);
      printf("%d¥n",b[i]);
   }
}

void sanbai(int b[])
{
   b[i] *= 3;
}

最初から2行目で「マクロ定義」をしています。

このように、

#define 文字 数字

とすることで、マクロ定義ができます。『文字』=『数字』となります。

2行目以降では、N=5となりNの値を変更することはできません。最初につくったプログラムでは、「5」の部分を「N」に変えることで、マクロを使用できます。

次に、3行目でグローバル変数を変数宣言しています。「main関数」もしくは「自作関数」の外で、変数宣言することで、プログラムのどこでもそのグローバル変数を使用できます。

まとめ

グローバル変数とマクロを使うことで、少しだけ簡単にプログラムを書くことができます。また、マクロを使えば、プログラムで使用する数字を少しだけ変更するときに、間違って一部だけ変更し忘れることがなくなります。そのため、バグ対策にもつながって一石二鳥です。

必要だと思ったときは、使うように心がけましょう。また、うまく使えば、プログラムを速く、簡単に書くことにもつながります。

次は、scanfを勉強してみましょう。