logo

C の多次元配列

前提条件: C の配列

多次元配列は、同種のデータを表形式で格納する配列の配列と呼ぶことができます。多次元配列のデータは通常、行優先の順序でメモリに格納されます。



N 次元配列を宣言する一般的な形式 以下に示します。

構文:

data_type array_name[size1][size2]....[sizeN];>
  • データ・タイプ : 配列に格納されるデータのタイプ。
  • 配列名 : アレイの名前。
  • サイズ1、サイズ2、…、サイズN :各寸法のサイズ。

:



スプリングブートアーキテクチャ
  Two dimensional array:   int two_d[10][20];   Three dimensional array:   int three_d[10][20][30];>

多次元配列のサイズ:

多次元配列に格納できる要素の総数は、すべての次元のサイズを乗算することで計算できます。
例えば:

  • 配列 int x[10][20] 合計 (10*20) = 200 個の要素を保存できます。
  • 同様に配列 int x[5][10][20] 合計 (5*10*20) = 1000 個の要素を保存できます。

配列のサイズをバイト単位で取得するには、単一要素のサイズと配列内の要素の総数を掛けます。
例えば:

  • 配列のサイズ int x[10][20] = 10 * 20 * 4 = 800 バイト。 (int = 4 バイト)
  • 同様に、次のサイズ int x[5][10][20] = 5 * 10 * 20 * 4 = 4000 バイト。 (int = 4 バイト)

多次元配列の最も一般的に使用される形式は次のとおりです。



  1. 二次元配列
  2. 三次元配列

C の 2 次元配列

二次元配列 または 2次元配列 C における は、多次元配列の最も単純な形式です。 2 次元配列は、1 次元配列が重ねて配置され、「x」行と「y」列で構成されるテーブルを形成するものとして視覚化できます。行番号は 0 から (x-1) の範囲であり、列番号は次のとおりです。範囲は 0 から (y-1) までです。

2次元配列のグラフィック表現

サイズ 3 x 3 の 2 次元配列のグラフィック表現

C での 2 次元配列の宣言

2D 配列を宣言する基本的な形式 バツ 行と そして C の列を以下に示します。

構文:

data_type array_name[x][y];>

どこ、

  • データ・タイプ: 各要素に格納されるデータのタイプ。
  • 配列名: 配列の名前
  • バツ: 行の数。
  • そして: 列の数。

10 行 20 列の 2 次元整数配列「x」を次のように宣言できます。

例:

int x[10][20];>

注: このタイプの宣言では、配列にはスタック内のメモリが割り当てられ、配列のサイズはコンパイル時に既知である必要があります。つまり、配列のサイズは固定されています。前述のメソッドを使用して、C で配列を動的に作成することもできます。 ここ。

C での 2 次元配列の初期化

2D 配列を初期化できるさまざまな方法は次のとおりです。

  1. イニシャライザリストの使用
  2. ループの使用

1. Initializer Listを使用した2D配列の初期化

以下の例に示すように、初期化リストを使用して C で 2D 配列を初期化できます。

最初の方法:

int x[3][4] = {0, 1 ,2 ,3 ,4 , 5 , 6 , 7 , 8 , 9 , 10 , 11}>

上記の配列には 3 行 4 列があります。中括弧内の要素は左から右に、テーブルにも左から右に格納されます。要素は配列に順番に埋められます。左から最初の 4 要素が最初の行に埋められ、次の 4 要素が 2 行目に埋められます。

2 番目の方法 (より良い方法) :

int x[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};>

このタイプの初期化では、入れ子になった中括弧を使用します。内側の中括弧の各セットは 1 行を表します。上の例では、合計 3 行があるため、内側の中括弧が 3 セットあります。この方法の利点は、理解しやすいことです。

注: 初期化子リストの要素の数は、常に配列内の要素の合計数以下である必要があります。

リストの初期化を使用している場合は、行のサイズを定義せずに配列を宣言することもできます。この場合、コンパイラは配列のサイズを自動的に推定します。

data_type array_name[][y] = {...} ;>

列数を定義することは依然として必須です。

2. ループを使用した 2D 配列の初期化

以下の例に示すように、任意の C ループを使用して 2D 配列の各メンバーを 1 つずつ初期化できます。

例:

int x[3][4]; for(int i = 0; i <3; i++){ for(int j = 0; j < 4; j++){ x[i][j] = i + j; } }>

この方法は、各要素の値に何らかの順序関係がある場合に便利です。

C での 2 次元配列の要素へのアクセス

2D 配列の要素には、行インデックスと列インデックスを使用してアクセスします。 2D 配列内の各要素は、次の方法で参照できます。

構文:

array_name[i][j]>

どこ、

  • 私: 行インデックス。
  • j: 列のインデックス。

例:

int x[2][1];>

上記の例は、3 行 2 列目に存在する要素を表しています。

注記 : 配列では、配列のサイズが N の場合、そのインデックスは 0 から N-1 になります。したがって、行インデックス 2 の場合、行番号は 2+1 = 3 になります。 2 次元配列のすべての要素を出力するには、ネストされた for ループを使用できます。 2 つの「」が必要になります のために ' ループします。 1 つは行を横断するもの、もう 1 つは列を横断するものです。

配列全体を出力するには、ループを使用して各要素に 1 つずつアクセスします。走査の順序は、要件に応じて行優先または列優先にすることができます。以下の例は、2D 配列の行優先の走査を示しています。

例:

C




// C Program to print the elements of a> // Two-Dimensional array> #include> int> main(>void>)> {> >// an array with 3 rows and 2 columns.> >int> x[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };> >// output each array element's value> >for> (>int> i = 0; i <3; i++) {> >for> (>int> j = 0; j <2; j++) {> >printf>(>'Element at x[%i][%i]: '>, i, j);> >printf>(>'%d '>, x[i][j]);> >}> >}> >return> (0);> }> // This code is contributed by sarajadhav12052009>

>

偏微分記号ラテックス
>

出力

Element at x[0][0]: 0 Element at x[0][1]: 1 Element at x[1][0]: 2 Element at x[1][1]: 3 Element at x[2][0]: 4 Element at x[2][1]: 5>

時間計算量: O(N*M) ここで、N(ここでは 3) と M(ここでは 2) はそれぞれ行数と列数です。

空間の複雑さ:O(1)

2D 配列はどのようにメモリに保存されるのでしょうか?

2 次元配列の要素はメモリ内に連続して格納する必要があります。コンピュータのメモリ アドレスは線形であるため、2 次元配列を線形化して保存できるようにする必要があります。配列要素の線形化を実現するには 2 つの方法があります。

  • 行優先- 線形化手法では、まず配列の最初の行、次に配列の 2 行目、次に 3 行目というように格納されます。 (つまり、要素は行ごとに格納されます。行は列に基づいてリストされます)
  • 列優先 – この線形化手法では、最初に最初の列、次に 2 番目の列、次に 3 番目の列というように格納されます (要素は列方向に格納されます。列は行に基づいてリストされます)。

コンピュータは配列のすべての要素のアドレスを追跡するわけではありませんが、ベース アドレス (最初の要素の開始アドレス) を追跡し、必要に応じて要素のアドレスを計算します。

詳細については、記事を参照してください – 1次元、2次元、3次元の要素のアドレス計算

C の 3 次元配列

三次元配列 または 3D C の array は 2 次元配列のコレクションです。これは、複数の 2D 配列が積み重ねられたものとして視覚化できます。

三次元配列のグラフィック表現

サイズ 3 x 3 x 3 の 3 次元配列のグラフィック表現

C での 3 次元配列の宣言

3D 配列は次のように宣言できます。 バツ それぞれが持つ 2D 配列 そして 行と 以下に示す構文を使用して列を作成します。

構文:

data_type array_name[x][y][z];>
  • データ・タイプ: 各要素に格納されるデータのタイプ。
  • 配列名: 配列の名前
  • バツ: 2D 配列の数。
  • そして: 各 2D 配列の行数。
  • と: 各 2D 配列の列の数。

例:

int array[3][3][3];>

C での 3 次元配列の初期化

3D 配列の初期化は 2D 配列の初期化と同じです。違いは、次元の数が増加するため、ネストされた中括弧の数も増加することです。

C の 3D 配列は、以下を使用して初期化できます。

  1. イニシャライザリスト
  2. ループ

イニシャライザリストを使用した 3D 配列の初期化

方法 1 :

int x[2][3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};>

方法 2 (より良い) :

int x[2][3][4] =   {   { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} },  { {12,13,14,15}, {16,17,18,19}, {20,21,22,23} }  };>

繰り返しますが、2D 配列と同様に、初期化にイニシャライザ リストを使用している場合は、最初の次元のサイズを指定せずに 3D 配列を宣言することもできます。コンパイラは最初の次元のサイズを自動的に推定します。ただし、残りのディメンションを指定する必要があります。

Java文字から文字列へ
data_type array_name[][y][z] = {....};>

ループを使用した 3D 配列の初期化

これは、もう 1 つの次元にアクセスするための入れ子になったループが 1 つある 2D 配列にも似ています。

int x[2][3][4]; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { for (int k=0; k<4; k++) { x[i][j][k] = (some_value); } } }>

C での 3 次元配列の要素へのアクセス

3D 配列内の要素へのアクセスも 2D 配列の場合と同様です。違いは、3D 配列で 1 つの追加次元に対して 2 つのループではなく 3 つのループを使用する必要があることです。

構文:

array_name[x][y][z]>

どこ、

  • バツ: 2D 配列のインデックス。
  • そして: その 2D 配列行のインデックス。
  • と: その 2D 配列列のインデックス。

C




// C program to print elements of Three-Dimensional Array> #include> int> main(>void>)> {> >// initializing the 3-dimensional array> >int> x[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } },> >{ { 6, 7 }, { 8, 9 }, { 10, 11 } } };> >// output each element's value> >for> (>int> i = 0; i <2; ++i) {> >for> (>int> j = 0; j <3; ++j) {> >for> (>int> k = 0; k <2; ++k) {> >printf>(>'Element at x[%i][%i][%i] = %d '>, i,> >j, k, x[i][j][k]);> >}> >}> >}> >return> (0);> }>

>

>

出力

Element at x[0][0][0] = 0 Element at x[0][0][1] = 1 Element at x[0][1][0] = 2 Element at x[0][1][1] = 3 Element at x[0][2][0] = 4 Element at x[0][2][1] = 5 Element at x[1][0][0] = 6 Element at x[1][0][1] = 7 Element at x[1][1][0] = 8 Element at x[1][1][1] = 9 Element at x[1][2][0] = 10 Element at x[1][2][1] = 11>

同様の方法で、任意の次元数の配列を作成できます。ただし、次元数が増えると複雑さも増します。最もよく使用される多次元配列は 2 次元配列です。

配列は C 言語のポインタとも密接に関連しています。 C における配列とポインターの関係について詳しくは、以下を参照してください。 これ 記事。