【C言語】配列の要素数を変数の値にする方法

はじめに

どうも! 高杉 皆為(@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);
}

ソースコードの説明

このコードには「ポインター」というものを使っており、これがわからないとコードが理解できなくなります。

ポインターの基礎についての詳しい説明は、次の記事でおこなっています。ポインターの基礎を理解したければ、ご覧ください。

さて、上記のプログラムの大まかな流れは、次のとおりです。

  1. *dataなどの変数を用意する。
  2. 配列の要素数を入力させる。
  3. 入力された要素数の領域を自動で確保し、*dataを1次元配列化する。
  4. 1次元配列dataに整数値を、順番に入力していく。
  5. 1次元配列dataに入れられた整数値を、順番に表示していく。
  6. 配列の領域の解放をおこなう。

また、1次元配列のイメージ図は次のとおりです。

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言語を扱う上では大切なものなので、頑張って理解してください!

この記事の次のステップとして、次の記事を用意しました。気になる方は、ぜひ読んでみてください。


 

みなためじゃんけん

 

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

 

私が出したのは……





 

チョキでした! グーの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集