スポンサーリンク

二次元配列の説明

二次元配列とは

今まで説明させて頂いていた配列は一次元配列ともうしまして、他に二次元配列、三、四・・等多次元宣言することが可能です。ただ一般的には二次元配列までしか実際に利用することは無いとの事です。

配列サンプルコード

二次元配列のサンプル(整数型(int)、実数型(double)、文字列型(char)のサンプルをそれぞれ用意しております。

int mydt[2][2];

double mydt[2][2];

char [2][2];

三次元配列

int mydt[2][2][2];

double mydt[2][2][2];

char [2][2][2];

それぞれの配列要素は説明しやすいように[2](添字)としております。
要素:mydt[要素] 任意に用意した配列の数。
下図の赤線部分が要素です。

一・二・三次元配列別説明サンプル

今までの配列(一次元配列)の場合【 int mydt[2]; 】とした場合
以下のようにメモリ上に確保されます。
※配列を宣言した場合、「0」からカウントされます

mydt[0]
mydt[1]

例えば mydt[1] = 5; と値を代入すると、以下のように値が確保されます。

mydt[0]
mydt[1] 5

二次元配列の場合【 int mydt[2][2]; 】とした場合
以下のように二組メモリ上に確保されます。

mydt[0][0]
mydt[0][1]
mydt[1][0]
mydt[1][1]

三次元配列の場合【 int mydt[2][2][2]; 】(多次元配列の説明は以下のみです。)
以下のようにメモリ上に確保されます。

mydt[0][0][0]
mydt[0][0][1]
mydt[0][1][0]
mydt[0][1][1]
mydt[1][0][0]
mydt[1][0][1]
mydt[1][1][0]
mydt[1][1][1]

二次元配列に初期値を設定する場合

まずサンプルソースコードをご覧ください。

int mydt[2][2] = {10,100,1000,10000};

二次元配列(多次元含む)に初期値を設定すると、先に変化する要素(添字)の順番で割り当てられます。

mydt[0][0] 10
mydt[0][1] 100
mydt[1][0] 1000
mydt[1][1] 1000

しかしながら配列要素が増えると、上記の初期値設定では読みにくい為、一般的には割り当てた組()づつカッコで区切り明確に記述方法が一般的になります。

int mydt[2][2] = { {10,100}, {1000,10000} };

確認サンプルソース

#include <stdio.h>
int main(void)
{
int mydt[2][2] = { {10,100},{1000,10000}};printf(“%d\n”,mydt[0][0]);
printf(“%d\n”,mydt[0][1]);
printf(“%d\n”,mydt[1][0]);
printf(“%d\n”,mydt[1][1]);return 0;
}

実行結果

要素数を増やした場合、以下のように分けて書くようにすれば見やすくまとめられます。

int mydt[6][2] = {
{10,100},
{1000,10000},
{20,200},
{2000,20000},
{30,300},
{3000,30000}
};

表にまとめると以下の順番で、各配列要素に代入されます。ようになります。

mydt[0][0] 10
mydt[0][1] 100
mydt[1][0] 1000
mydt[1][1] 1000
mydt[2][0] 20
mydt[2][1] 200
mydt[3][0] 2000
mydt[3][1] 20000
mydt[4][0] 30
mydt[4][1] 300
mydt[5][0] 3000
mydt[5][1] 30000

文字列型の二次元配列に付いて説明

char 文字列型の二次元配列に付いて説明させていただきたいと思います。

二次元サンプル(整数型(int)、実数型(double)、文字列型(char)のサンプル

要素数を二つ並べると二次元

int mydt[2][2];

double mydt[3][5];

char [4][6];

三次元配列サンプル
要素数を三つ並べると三次元

int mydt[1][1][3];

double mydt[2][2][4];

char [3][3][2];

要素:mydt[要素] 任意に用意した配列の数。
下図の赤線部分が要素です。

二次元配列の場合【 char moji[2][3]; 】とした場合
以下のように三行二組メモリ上に確保されます。

moji[0][0]
moji[0][1]
moji[0][2]
moji[1][0]
moji[1][1]
moji[1][2]

 

二次元文字配列に初期値を設定する場合

int moji[2][3] = {“AB”,”CD”};

二次元文字配列(多次元含む)に初期値を設定すると、先に変化する要素(添字)の順番で割り当てられます。
※charを用いた場合、文字終端マーク”0″だ代入される為、0が代入されます。

moji[0][0] A
moji[0][1] B
moji[0][2] 0
moji[1][0] C
moji[1][1] D
moji[1][2] 0

 

確認サンプルソースコード
解説:【 moji[0][i] 】のループと【 moji[1][i] 】を出力するループをそれぞれ作成し、
上記の表の通り i に0を代入して一づつ加算させて出力するようにしてみました。

#include <stdio.h>

int main(void)
{
char moji[2][3]={“AB”,”CD”};
int i;
for(i=0; i<=2; ++i){
printf(“%c”,moji[0][i]);
}
printf(“\n”);
for(i=0; i<=2; ++i){
printf(“%c”,moji[1][i]);
}

return 0;
}

実行結果

要素数を増やした場合。
※初期値に{ }を多様するのは、一般的で、記述を確認しやすくする為です。

char moji[6][10] = {
{“ABCDEFG”},
{“abcdefg”},
{“HIJK”},
{“hijk”},
{“LMNOPQRS”},
{“lmnopqrs”}
};

表にまとめると以下の様に代入されます

moji[][0] moji[][1] moji[][2] moji[][3] moji[][4] moji[][5] moji[][6] moji[][7] moji[][8] moji[][9]
moji[0][] A B C D E F G 0
moji[1][] a b c d e f g 0
moji[2][] H I J K 0
moji[3][] h i j k 0
moji[4][] L M N O P Q R S 0
moji[5][] l m n o p q r s 0

確認サンプルソースコード
それぞれ文字が存在する【 moji[][3] 】の項目で確認とします

#include <stdio.h>

int main(void)
{

char moji[6][10]={
{“ABCDEFG”},
{“abcdefg”},
{“HIJK”},
{“hijk”},
{“LMNOPQRS”},
{“lmnopqrs”}
};

int i;
for(i=0; i<=5; ++i){
printf(“moji[%d][3]=%c\n”, i, moji[i][3]);
}

return 0;
}

実行っ結果、上記の表の通り出力されているのがわかります。

 

二次元配列で代入された文字列を指定する方法の確認

※二次元配列で文字列を指定するには、配列要素の先頭を指定すれば、配列に代入された文字が出力されます。
※2、ループ実行条件の【 printf(“%s”,moji[i]); 】としておりますが、ループ条件はiに0~5まで加算してそれぞれ出力としていますので、ループ条件を書かない場合以下の記述と同じになります。
【 printf(“%s”,moji[0]); 】~【 printf(“%s”,moji[5]); 】

#include <stdio.h>

int main(void)
{

char moji[6][10]={
{“ABCDEFG”},
{“abcdefg”},
{“HIJK”},
{“hijk”},
{“LMNOPQRS”},
{“lmnopqrs”}
};

int i;
for(i=0; i<=5; ++i){
printf(“moji[%d][]=%s\n”, i, moji[i]);
}

return 0;
}

実行結界です。

 

コメント

タイトルとURLをコピーしました