AIで楽して稼げたらいいのに

独学でプログラミングを学んでいる大学生です。忘れないために備忘録としてここに残すことにします

【入門】C言語の2次元配列について図でわかりやすく解説!

配列については前回の記事で紹介しました。
知りたい方は過去記事をご覧ください!

gorilland-k.hatenablog.com




この過去記事で紹介した配列は厳密に言うと、「1次元配列」と言うものです。

なので今回はもう少し踏み込んだ、2次元配列について解説していきます!




はじめに


1次元配列と2次元配列はソースコード上では下記の様に表します。

int aa[4]; // 1次元配列
int aa[3][4]; // 2次元配列

これがどの様な違いがあるのか解説していきます。


【復習】1次元配列とは


前回の記事でも紹介したので詳細は省きますが、

int aa[4];



と定義した場合、「4つの箱が用意される」イメージだという話をしました。 詳しい話は過去記事を参照してください。

gorilland-k.hatenablog.com



1次元配列を別視点として考えてみます。
「次元」という言葉を数学的に捉えてみてください。1次元とはつまり「直線」です。


f:id:gorilland_k:20191211230216p:plain


1次元配列はこういった直線のように1方向に定義されていきます。数学的な直線をプログラムの配列に置き換えると、


f:id:gorilland_k:20191211231540p:plain


この様になります。

2次元配列の概要

2次元配列の定義



2次元配列をソースコード上で表現するとき、

int aa[3][4];
double [4][5];

と上記の様に定義します。これはfloatやcharでも使うことができます。


2次元配列の初期化



2次元配列を初期化するとき、少しだけ特殊な書き方をします。

int aa[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };


このように配列では{ }で囲う必要があります。 なぜこのような数字の並びになるのかは次で紹介します。 ちなみに、この2次元配列でも省略化することが可能です。


int aa[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };



省略した形が上記の様になります。
[4]は?と思うかもしれませんが、縦の段の値は省略できても横の段の値は省略することができません。



2次元配列のイメージ



2次元配列のイメージの仕方は1次元配列と同様に数学的に考えると、「平面」です。平面と考えるのもいいのですが、私は行列の考え方のほうがわかりやすいと思います。


行列がわからない方のためにも図を用いて説明します。

2次元配列 aa[ i ][ j ]としたときのイメージとしては以下の図となります。


f:id:gorilland_k:20191211233357p:plain


図より、「 i 」は縦の列、「 j 」は横の列というイメージです。





ここで先ほどのソースコードをみてみましょう。


int aa[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };




この宣言では先ほどの説明から、縦3段、横4段が定義されています。よって図に表すと下記の様になります。


f:id:gorilland_k:20191212001951p:plain


以上からソースコードの詳細をまとめると、


f:id:gorilland_k:20191212003545p:plain


この様になります。この書きこみ方の原則を覚えておいてください。

2次元配列の入力と表示

int aa[3][4];

この宣言文を用いて、

f:id:gorilland_k:20191212011418p:plain

このように出力される様にプログラムするときどの様にしますか?

#include <stdio.h>

int main(void){
  int aa[3][4];
  int i, j;
  for(i=0; i<3; i++){
    for(j=0; j<4; j++){
      printf("aa[%d][%d]? ", i, j);
      scanf("%d", &aa[i][j]);
    }
  }
  for(i=0; i<3; i++){
    for(j=0; j<4; j++){
      printf("%d ", aa[i][j]);
    }
    printf("\n");
  }
}



サンプルプログラムは上記の通りです。for文の2重ループを使うことでうまくいきます。char配列のときにはscanf()に&は必要ないですが今回は必要ですので気をつけてください。

まとめ

今回は2次元配列について解説してきました。
コツをつかめば1次元でも2次元でも使いこなせる様になると思います。


2次元配列 aa[縦][横] または aa[行][列]というイメージだということを理解するころができれば今回はOKです。


応用については今後機会あれば記事にしていきたいと思います。