https://youtu.be/s9qs2PU8S1Y

\textcolor{pink}{四国めたん: }教師役ですわ

\textcolor{lime}{ずんだもん: }生徒役なのだ
\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです
\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ
\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう
\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ
\footnotesize \textcolor{pink}{四国めたん:} 以前、配列についてお話ししましたわ
\footnotesize \textcolor{lime}{ずんだもん:} おぼえているのだ
\footnotesize \textcolor{pink}{四国めたん:} 今回は 多次元配列 についてお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} 多次元配列 ?
\footnotesize \textcolor{pink}{四国めたん:} 簡単にいえば、配列の配列のことですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} さらに、 多次元配列 と共に、よく使われる 多重ループ についてもお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} よろしくお願いするのだ
多次元配列を使ってみましょう
\footnotesize \textcolor{pink}{四国めたん:} 例えば、 文字列の配列 を考えてみましょう
\footnotesize \textcolor{lime}{ずんだもん:} 文字列自体が配列なのではないか?
\footnotesize \textcolor{pink}{四国めたん:} はい、文字列は char型 の 配列 なので、 文字列の配列 は、 char型の配列の配列 ということになりますわ
\footnotesize \textcolor{lime}{ずんだもん:} 配列の配列 か...
\footnotesize \textcolor{pink}{四国めたん:} これが 2次元配列 ですわ
\footnotesize \textcolor{lime}{ずんだもん:} つまり、一般的な 配列 である文字列は 1次元配列 ということか
\footnotesize \textcolor{pink}{四国めたん:} その通りですわ
\footnotesize \textcolor{lime}{ずんだもん:} 具体例をおねがいするのだ
\footnotesize \textcolor{pink}{四国めたん:} わかりましたわ
#include <stdio.h>
void main() {
char c[3][6] = {"one", "two", "three"};
return;
}
\footnotesize \textcolor{pink}{四国めたん:} サイズ6の文字の配列、つまり文字列の、サイズ3の配列ですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} 多次元配列の場合、一番右側の角括弧"[]"の要素が、メモリ上に連続して配置されますわ
\footnotesize \textcolor{lime}{ずんだもん:} そうなのか?
\footnotesize \textcolor{pink}{四国めたん:} 確認のため、return
の行にブレークポイントをセットして実行してみましょう
\footnotesize \textcolor{lime}{ずんだもん:} 実行が止まったのだ
\footnotesize \textcolor{pink}{四国めたん:} その状態で、メニューの デバッグ → ウィンドウ → メモリ → メモリ1 を選択します。

\footnotesize \textcolor{lime}{ずんだもん:} メモリ1ウィンドウが表示されたのだ
\footnotesize \textcolor{pink}{四国めたん:} メモリ1ウィンドウの アドレス に変数名"c"を入力してみましょう
\footnotesize \textcolor{lime}{ずんだもん:} メモリ1ウィンドウの数値が変わったのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、メモリ1ウィンドウには変数cのアドレス以降のメモリ内容が表示されていますわ
\footnotesize \textcolor{lime}{ずんだもん:} なんか、右側に変な文字が表示されているのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、右側には、メモリ内容を文字として表示する部分がありますわね
\footnotesize \textcolor{lime}{ずんだもん:} "one", "two", "three"と表示されているのだ
\footnotesize \textcolor{pink}{四国めたん:} そうですわね

\footnotesize \textcolor{pink}{四国めたん:} それでは、文字列を表示してみましょう
#include <stdio.h>
void main() {
char c[3][6] = {"one", "two", "three"};
for (size_t i = 0; i < 3; i++) {
printf("%s\n", c[i]);
}
}

\footnotesize \textcolor{lime}{ずんだもん:} 「one」、「two」、「three」と表示されたのだ
\footnotesize \textcolor{pink}{四国めたん:} しっかりと文字列が表示できましたわ
\footnotesize \textcolor{lime}{ずんだもん:} ところでprintf
内では、文字列の指定としてc[i]
を使用しているのだが?
\footnotesize \textcolor{pink}{四国めたん:} はい、これは&(c[i][0])
を指定した場合と同じ意味で、アドレスを表していますわ
\footnotesize \textcolor{lime}{ずんだもん:} ところで2次元だけではなく、3次元以上の配列も可能なのか?
\footnotesize \textcolor{pink}{四国めたん:} 可能ですわ
\footnotesize \textcolor{pink}{四国めたん:} 最大は8次元程度かと思いますが、実際に使うのは4次元以下かと思いますわ
\footnotesize \textcolor{lime}{ずんだもん:} そうなのか
\footnotesize \textcolor{pink}{四国めたん:} まぁ、通常は3次元までで、それより次元が大きくなるのであれば、 アルゴリズム や データ構造 を見直す方がいいと思いますわ
\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ
要素数の省略
以前、配列の宣言時に初期化を伴う場合には、配列の要素数の指定を省略することができることをお話ししました
では、多次元配列の場合には、初期化時に要素数を省略することができるのでしょうか
実は、多次元配列の場合には、初期化時に 全ての 要素数を省略することはできません
省略することができるのは、最初の配列の要素数です
サンプルプログラムでは以下のようになります
#include <stdio.h>
void main() {
char c[][6] = {"one", "two", "three"};
for (size_t i = 0; i < 3; i++) {
printf("%s\n", c[i]);
}
}
多重ループを使ってみましょう
\footnotesize \textcolor{pink}{四国めたん:} 次は 多重ループ についてお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} 多重ループ ?
\footnotesize \textcolor{pink}{四国めたん:} 多重ループ とは、ループの中にループを配置する構造のことですわ
\footnotesize \textcolor{lime}{ずんだもん:} forループ の中に forループ を配置するのか?
\footnotesize \textcolor{pink}{四国めたん:} はい、一般的には forループ を使用しますが、 whileループ も使えますわね
\footnotesize \textcolor{lime}{ずんだもん:} そうなのか...
\footnotesize \textcolor{pink}{四国めたん:} なお、 多重ループ は 多次元配列 と相性がいいので、一緒に使われることが多いですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} とりあえずは、具体例を見てみましょう
#include <stdio.h>
void main() {
int a[4][2] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}};
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 2; x++) {
printf("座標(%d, %d)の値は%d\n", x, y, a[y][x]);
}
}
}

\footnotesize \textcolor{lime}{ずんだもん:} お~、座標とその値が並んだのだ
\footnotesize \textcolor{pink}{四国めたん:} そうですわね
\footnotesize \textcolor{lime}{ずんだもん:} 詳細を教えてほしいのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、まず、数値などの多次元配列の初期化は、波括弧"{}"の中に波括弧"{}"を含める形になりますわ
\footnotesize \textcolor{lime}{ずんだもん:} すこしややこしいのだ
\footnotesize \textcolor{pink}{四国めたん:} 多次元配列の宣言時に指定した要素数の内、いちばん右側の角括弧"[]"内の数が、いちばん内側の波括弧"{}"内の要素数となりますわ
\footnotesize \textcolor{lime}{ずんだもん:} う~ん、なるほど...
\footnotesize \textcolor{pink}{四国めたん:} 次に forループ ですが、一般的に外側のループは多次元配列の最初の配列の要素、つまり最初の角括弧"[]"を指定するために使用しますわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} 更に、その内側の forループ は、2番目の配列の要素、つまり2番目の角括弧"[]"を指定するために使用しますわね
\footnotesize \textcolor{lime}{ずんだもん:} ふむふむ
\footnotesize \textcolor{pink}{四国めたん:} 今回のように、外側の forループ のカウンターを"y"、内側の forループ のカウンターを"x"とする場合を考えてみましょう
\footnotesize \textcolor{lime}{ずんだもん:} 多次元配列"a"の要素指定はa[y][x]
となるのだ
\footnotesize \textcolor{pink}{四国めたん:} その通りですわ
まとめ
\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした
\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ
\footnotesize \textcolor{pink}{四国めたん:} 以上で 多次元配列と多重ループ を終了しますわ
Discussion