C言語の配列とは ~宣言、初期化、代入、コピー方法と2次元配列~
配列とは、複数の同じ型のデータをまとめて扱うことで、効率的に操作するためのデータ構造です。例えばfor文のループを使うことで複数の値や文字列の処理を簡潔に記述することができます。この記事では、配列の宣言や初期化の方法、値の代入やコピーの方法および2次元配列の使い方を解説します。
1.配列とは
配列とは、同じデータ型の複数の値をひとつの変数で宣言し、ひとかたまりとして扱うデータ構造です。同じ属性のデータ(例えばテストの点数など)をまとめることで直感的にわかりやすくなり、また処理を効率的に書くことができるのでプログラムが読みやすくなります。
1-1.配列とは
同じデータ型の複数の値を扱う場合、変数を複数個宣言しても、配列を宣言しても、同じような処理を行うことができます。配列には変数にないメリットがあり、プログラムを短く簡潔に書くことができ、効率的にデータを扱うことができます。
例えば100個のデータに同じ処理を行う場合、変数では同じ処理を100回記述するのに対し、配列ではfor文のループを使うことで処理の記述を1回で済ませることができます。
1-2.配列の宣言
配列を宣言するには、データ型名、配列名、そして配列名の後に「[]」で囲んで要素数を記述します。例えばint型の配列は以下のように宣言します。
int int_array[5];
2.配列の使い方
配列の初期化、値の代入、コピーの方法、そして2次元配列の使い方について解説します。
2-1.配列の初期化
配列の初期化には、宣言と同時に初期化する方法と、後述する値の代入によって初期化する方法があります。ここでは宣言と同時に初期化する方法について解説します。宣言と同時に初期化する場合、値を「{}」で囲い、「,」で区切って記述します。
int int_array[5]={0,1,2,3,4};
宣言と同時に初期化すると、要素数を省略することができます。初期化で指定した値の個数が要素数となります。
int int_array[]={0,1,2,3,4};
初期値を省略してゼロで初期化することも可能です。
int int_array[5]={};
この場合、全要素がゼロで初期化されます。
int int_array[5]={0,1,2};
この場合、配列の先頭から指定した値で初期化され、省略した要素がゼロで初期化されます。
char型の配列の場合、上記の方法以外に文字列で初期化することができます。
char char_array[5]=”Hello”;
2-2.配列への値の代入
配列に値を代入する方法について解説します。配列を宣言した後に初期化する場合にも値の代入を行います。配列を宣言した後は、「{}」で囲んで複数の値を一度に代入することはできませんので注意してください。配列を宣言した後は、配列名の後の「[]」で囲んだ数字で要素番号を指定し、変数と同様に値を代入します。要素番号は0番目から始まりますので注意してください。
int int_array[0]=0; int int_array[1]=1; int int_array[2]=2; int int_array[3]=3; int int_array[4]=4;
ここで配列のメリットが活かせます。配列の要素の番号には変数を使用できるため、1個ずつ値を代入する処理をfor文のループで記述できます。
for (int i=0;i<5;i++) { int_array[i]=i; }
また、for文のループは配列の値を出力する際にも使用できます。
for (int i=0;i<5;i++) { printf(“%d”,int_array[i]); }
for文の繰り返し回数には配列の要素数を指定しますが、具体的な値を指定する以外に、配列のメモリサイズ(以下「サイズ」とします)から要素数を計算で求めることができます。配列のサイズを求めるにはsizeof演算子を使用します。sizeof演算子を使用する場合、演算子名のあとに配列名を「()」で囲んで記述します。
sizeof(int_array)
sizeof演算子は変数や配列の要素を扱うこともでき、配列のサイズと配列の1要素のサイズを使って要素数を計算することができます。
sizeof(int_array) / sizeof(int_array[0])
ここで存在しない要素番号を指定するとエラーになりますので注意してください。
for文で使用するには、繰り返し回数として、sizeof演算子を使って要素数を計算する式を記述します。
for (int i=0;i<sizeof(int_array)/sizeof(int_array[0]);i++) { printf(“%d”,int_array[i]); }
2-3.配列のコピー
配列をコピーする方法について解説します。値の代入を使用して要素を1個ずつコピーする方法と、ビルトイン関数を使用する方法があります。ここではint_array1の各要素の値をint_array2にコピーする場合について解説します。値の代入を使用する場合、1個ずつ値をコピーする処理をfor文のループで記述します。
int int_array1[]={0,1,2,3,4}; int int_array2[]={0,0,0,0,0}; for (int i=0;i<5;i++) { int_array2[i]=int_array1[i]; }
ビルトイン関数を使用する場合はmemcpy関数を使用し、配列名とコピーするサイズを指定してコピーを行います。memcpy関数を使用するにはヘッダファイルmemory.hまたはstring.hを#includeで読み込み、コピー先配列名、コピー元配列名、コピーするサイズを「,」で区切り、「()」で囲って記述します。先述のsizeof演算子を使用して配列のサイズを指定することができます。
#include memcpy(int_array2,int_array1,sizeof(int_array1));
配列のコピーで使用するにはfor文のループで記述した値のコピー処理をmemcpy関数に置き換えます。
int int_array1[]={0,1,2,3,4}; int int_array2[]={0,0,0,0,0}; memcpy(int_array2,int_array1,sizeof(int_array1));
emcpy関数ではコピー先配列とコピー元配列の要素数は考慮されず、コピーするサイズに指定した値に従ってコピーが実行されます。そのため正しく配列名やサイズを指定しないと、配列の一部がコピーされたり、配列の要素数以上のコピーが行われて無関係な変数が上書きされる可能性がありますので注意してください。
2-4.2次元配列
2次元配列の使い方を解説します。2次元配列を使用すれば行と列から成る表を配列で扱うことができます。2次元配列を宣言するには、配列名の後に行の要素数、列の要素数をそれぞれ「[]」で囲んで記述します。行の要素数が2, 列の要素数が3の場合は以下のように記述します。
int int_array[2][3];
宣言と同時に初期化する場合、行ごとに値を「{}」で囲い、「,」で区切ります。さらに行を「,」で区切り、初期値全体を「{}」で囲います。最初の要素数に限って省略することができ、初期化で指定した値の個数で要素数が決まります。
int int_array[][3]={ {0,1,2}, {3,4,5} };
この場合、行の要素数は2となります。
初期値の一部または全部を省略してゼロで初期化することができます。また行を囲う「{}」も省略することができます。
int int_array[2][3]={};
この場合、全要素がゼロで初期化されます。
int int_array[2][3]={0,1,2,3};
この場合、配列の先頭から指定した値で初期化され、省略した要素がゼロで初期化されます。
以下のように初期化するのと同じ結果となります。
int int_array[2][3]={ {0,1,2}, {3,0,0} };
配列への値の代入、配列のコピーは通常の配列と同様に行えますので2-2.、2-3.を参照してください。解説は省略しますが、3次元以上の配列も同様に宣言して使うことができます。
3.さいごに
配列の宣言や初期化の方法、値の代入やコピーの方法および2次元配列の使い方を解説しました。配列を使うと同じ型のデータをまとめて扱うことができ、個々の要素に要素番号で簡単にアクセスできます。また2次元配列を使えば、表で管理するようにデータを扱うことができますので、ぜひ使ってみてください。
コメント