はじめに
どうも! みなため(@MinatameT)です。
C言語でプログラミングをするとき、「配列の要素数を後で決めたい」と思うときがあります。例えば、プログラム実行中に、scanf関数で要素数を入力させる……といったことが考えられますね。
……ということで、この記事では、配列の要素数を変数の値にする方法を説明します。
ちなみに、配列の要素数をプログラム実行中に決めることを「メモリー領域の動的確保」と言ったりします。
配列の要素数を変数の値にするプログラム例
ソースコード
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int *data; //ポインター変数(後で1次元配列化する。)
int n; //1次元配列の要素数
int e; //1次元配列の要素番号
printf("配列の要素数(data)を入力してください。>");
scanf("%d",&n);
//malloc関数で、メモリー領域を動的確保する。
data = (int*)malloc(sizeof(int)*n); //int型のスペースを要素数の分だけ確保する。
printf("整数値を入力してください。\n");
for(e=0; e<n; e=e+1) //要素数の分だけループする。
{
printf("data[%d]の入力>",e);
scanf("%d",&data[e]); //整数値の入力
}
printf("配列に格納された整数値は、以下のとおりです。\n");
for(e=0; e<n; e=e+1) //要素数の分だけループする。
{
printf("data[%d] = %d\n",e,data[e]); //整数値の出力
}
free(data); //メモリー領域の解放
return(0);
}
ソースコードの説明
このコードには「ポインター」というものを使っており、これがわからないとコードが理解できなくなります。
ポインターの基礎についての詳しい説明は、次の記事でおこなっています。ポインターの基礎を理解したければ、ご覧ください。
さて、上記のプログラムの大まかな流れは、次のとおりです。
- *dataなどの変数を用意する。
- 配列の要素数を入力させる。
- 入力された要素数の領域を自動で確保し、*dataを1次元配列化する。
- 1次元配列dataに整数値を、順番に入力していく。
- 1次元配列dataに入れられた整数値を、順番に表示していく。
- 配列の領域の解放をおこなう。
また、1次元配列のイメージ図は次のとおりです。
領域の動的確保をしているのは、次の部分です。
data = (int*)malloc(sizeof(int)*n); //int型のスペースを要素数の分だけ確保する。
この部分では、dataに「n個(入力値)の要素数のint型領域」を確保させています。こうすることで、data[e]というように、変数dataを1次元配列化することができます。
ただし、malloc関数で動的確保した領域は、free関数で最後に解放してあげる必要があります。
free(data); //メモリー領域の解放
これで、dataが確保していた領域を解放することができます。
それでは、このプログラムの実行結果の例を確認していきます。
実行結果の例
配列の要素数(data)を入力してください。>5
整数値を入力してください。
data[0]の入力>2
data[1]の入力>4
data[2]の入力>6
data[3]の入力>8
data[4]の入力>10
配列に格納された整数値は、以下のとおりです。
data[0] = 2
data[1] = 4
data[2] = 6
data[3] = 8
data[4] = 10
このように、配列の要素数を変数にすることができました! ただ、ポインターの基礎の理解が必要なので、そのあたりは大変ですね。
「超難しい」というわけではないですし、C言語を扱う上では大切なものなので、頑張って理解してください!
この記事の次のステップとして、次の記事を用意しました。気になる方は、ぜひ読んでみてください。